home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Reference / the cmsp digests ('94-'97) / csmp digest Vol 3 No 059 < prev    next >
Internet Message Format  |  1997-05-06  |  86KB

  1. From: pottier@clipper.ens.fr (Francois Pottier)
  2. Subject: csmp-digest-v3-059
  3. Date: Mon, 19 Sep 1994 11:51:20 +0200 (MET DST)
  4.  
  5. C.S.M.P. Digest             Mon, 19 Sep 94       Volume 3 : Issue 59
  6.  
  7. Today's Topics:
  8.  
  9.         AppleGuide script examples anyone?
  10.         Crazy error alert messages?
  11.         Goto Pro's and Con's
  12.         Need help with saving-writing structs to a file.
  13.         PBCatSearch-catChangedErr
  14.         PixToPic
  15.         Slashed Progress Bar
  16.  
  17.  
  18.  
  19. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  20. (pottier@clipper.ens.fr).
  21.  
  22. The digest is a collection of article threads from the internet newsgroup
  23. comp.sys.mac.programmer.  It is designed for people who read c.s.m.p. semi-
  24. regularly and want an archive of the discussions.  If you don't know what a
  25. newsgroup is, you probably don't have access to it.  Ask your systems
  26. administrator(s) for details.  If you don't have access to news, you may
  27. still be able to post messages to the group by using a mail server like
  28. anon.penet.fi (mail help@anon.penet.fi for more information).
  29.  
  30. Each issue of the digest contains one or more sets of articles (called
  31. threads), with each set corresponding to a 'discussion' of a particular
  32. subject.  The articles are not edited; all articles included in this digest
  33. are in their original posted form (as received by our news server at
  34. nef.ens.fr).  Article threads are not added to the digest until the last
  35. article added to the thread is at least two weeks old (this is to ensure that
  36. the thread is dead before adding it to the digest).  Article threads that
  37. consist of only one message are generally not included in the digest.
  38.  
  39. The digest is officially distributed by two means, by email and ftp.
  40.  
  41. If you want to receive the digest by mail, send email to listserv@ens.fr
  42. with no subject and one of the following commands as body:
  43.     help                        Sends you a summary of commands
  44.     subscribe csmp-digest Your Name    Adds you to the mailing list
  45.     signoff csmp-digest            Removes you from the list
  46. Once you have subscribed, you will automatically receive each new
  47. issue as it is created.
  48.  
  49. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  50. Questions related to the ftp site should be directed to
  51. scott.silver@dartmouth.edu. Currently no previous volumes of the CSMP
  52. digest are available there.
  53.  
  54. Also, the digests are available to WAIS users.  To search back issues
  55. with WAIS, use comp.sys.mac.programmer.src. With Mosaic, use
  56. http://www.wais.com/wais-dbs/comp.sys.mac.programmer.html.
  57.  
  58.  
  59. -------------------------------------------------------
  60.  
  61. >From d.a.davies@bham.ac.uk (David Davies)
  62. Subject: AppleGuide script examples anyone?
  63. Date: Thu, 01 Sep 1994 14:27:20 +0000
  64. Organization: Birmingham University, UK.
  65.  
  66. Has anyone had a go at writing scripts for AppleGuide? Would anyone mind
  67. showing me just the simplest example if they have one. I've seen lots of
  68. compiled guides working but not seen the source for any as yet. I have a
  69. version of GuideMaker from one of the 7.5 beta CDs and I wanted to have a
  70. go at making a Guide myself...
  71.  
  72. Thanks,
  73.  
  74. -- 
  75. David Davies
  76.  
  77. Department of Physiology, University of Birmingham, UK.
  78.  
  79. Tel: 021 414 3255        Fax: 021 414 6924
  80.  
  81. http://medweb.bham.ac.uk/http/signatures/davies.html
  82.  
  83. +++++++++++++++++++++++++++
  84.  
  85. >From quinn@cs.uwa.edu.au (Quinn "The Eskimo!")
  86. Date: Fri, 02 Sep 1994 11:58:43 +0800
  87. Organization: Department of Computer Science, The University of Western Australia
  88.  
  89. In article <d.a.davies-0109941427200001@med262.bham.ac.uk>,
  90. d.a.davies@bham.ac.uk (David Davies) wrote:
  91.  
  92. >Has anyone had a go at writing scripts for AppleGuide?
  93.  
  94. Yes (:
  95.  
  96. >Would anyone mind showing me just the simplest example if they have one.
  97.  
  98. [Well it's not simple but it is comprehensive.]  I just posted the source
  99. code to the Anarchie Guide to MacGifts, so it should show up on UMich and
  100. Info-Mac mirrors soon.
  101.  
  102. Here are the blurb I attached to the MacGifts mailing...
  103.  
  104. >Attached is the Anarchie Guide source code distribution.  Anarchie Guide
  105. >is one of the first publically available guides and I decided to make its
  106. >source code available for two reasons.  Firstly it’s very hard to localise
  107. >a guide without source code. Secondly there is no publically available
  108. >guide source code and I thought it would be a good chance to rectify that.
  109. >
  110. >You need GuideMaker to be able to build this source however the source
  111. >code files are text files and you can browse them with any text editor.
  112.  
  113. For those of you too excited to wait, you can FTP it from...
  114.  
  115.   ftp://redback.cs.uwa.edu.au/Others/Quinn/
  116.  
  117. Share and Enjoy.
  118. -- 
  119. Quinn "The Eskimo!"        "Scout in a can. Simple, cheap, easy
  120.                             to use and it's expendable!"
  121.   Now if only Redback would stay up for more than 5 minutes, huh Pete?
  122.  
  123. ---------------------------
  124.  
  125. >From rtmd30@email.sps.mot.com (Greg Ferguson)
  126. Subject: Crazy error alert messages?
  127. Date: Tue, 23 Aug 1994 20:45:12 GMT
  128. Organization: Motorola, Inc.
  129.  
  130. Hi,
  131.  
  132. We're looking for some ideas for out-of-the-ordinary Alert messages.
  133.  
  134. My manager suggested the following one day:
  135.  
  136. I suggest that we use this as the standard unanticipated error message in
  137. all applications that we develop.  That is, after analyzing all know error
  138. conditions (which hopefully would present a relevant error message),
  139. display the following message as a last resort:
  140.  
  141. AN ERROR HAS JUST OCCURRED WHICH WAS PREVIOUSLY THOUGHT TO BE IMPOSSIBLE.
  142.  
  143. (taken from an old mainframe manual)
  144.  
  145. This is for those "we're going to crash if you do that again" type situations.
  146.  
  147. BTW, we can afford to be a bit frivolous as this is for in-house and test
  148. code. :-)
  149.  
  150. Thanks,
  151.  
  152. Greg
  153.  
  154. -- 
  155.  
  156. Greg Ferguson
  157. rtmd30@email.sps.mot.com
  158.  
  159. +++++++++++++++++++++++++++
  160.  
  161. >From Jeff Abrahamson <Jeff@purple.com>
  162. Date: Wed, 24 Aug 94 08:18:36 -0500
  163. Organization: Purple
  164.  
  165.  
  166. In article <rtmd30-2308941345120001@pangaea.sps.mot.com>, Greg Ferguson writes:
  167.  
  168. > We're looking for some ideas for out-of-the-ordinary Alert messages.
  169. > My manager suggested the following one day:
  170. > I suggest that we use this as the standard unanticipated error message in
  171. > all applications that we develop.  That is, after analyzing all know error
  172. > conditions (which hopefully would present a relevant error message),
  173. > display the following message as a last resort:
  174. > AN ERROR HAS JUST OCCURRED WHICH WAS PREVIOUSLY THOUGHT TO BE IMPOSSIBLE.
  175. > (taken from an old mainframe manual)
  176. > This is for those "we're going to crash if you do that again" type 
  177. situations.
  178. > BTW, we can afford to be a bit frivolous as this is for in-house and test
  179. > code. :-)
  180.  
  181. Well, then, how about:
  182.  
  183.     A subspace error (-129937) has occurred. Please check
  184.     this universe for consistency.
  185.  
  186. or
  187.  
  188.     An ATSM error has occurred. Please quit as soon as possible
  189.     to avoid previous crashes.
  190.  
  191. [ATSM is the Advanced Time Services Manager. It was discussed either here in a 
  192. previous thread or on the CW mailing list. Jens Alfke has most thoroughly 
  193. documented its use. :-) ]
  194.  
  195. -Jeff Abrahamson
  196.  clio!jeff@vu-vlsi.ee.vill.edu
  197.  
  198. +++++++++++++++++++++++++++
  199.  
  200. >From kenlong@netcom.com (Ken Long)
  201. Date: Wed, 24 Aug 1994 15:18:50 GMT
  202. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  203.  
  204. How about:
  205.  
  206. "Yours is the only Macintosh this error ever occurred on."
  207.    "Please report what you did to cause it to Apple."
  208.  
  209. or:
  210.  
  211. "It broke!"
  212.  
  213. or:
  214.  
  215. "Why should I tell YOU what there error number was?"
  216.       "You'll never be able to correct it!"
  217.  
  218. "Try that again and you'll be ordered to use IBM's
  219.                  for 6 months"
  220.  
  221. All seriousness aside...
  222.  
  223. -Ken-
  224.  
  225. +++++++++++++++++++++++++++
  226.  
  227. >From ogawa@teleport.com (Arthur Ogawa)
  228. Date: Wed, 24 Aug 94 21:25:02 GMT
  229. Organization: TeX Consultants
  230.  
  231. In Article <94082408183600240@purple.com>, Jeff Abrahamson <Jeff@purple.com>
  232. wrote:
  233. >
  234. >In article <rtmd30-2308941345120001@pangaea.sps.mot.com>, Greg Ferguson writes:
  235. >
  236. >> We're looking for some ideas for out-of-the-ordinary Alert messages.
  237. [deleted]
  238. Here's one from TeX, by Donald Knuth:
  239.  
  240. "This can't happen"
  241. Arthur Ogawa, TeX Consultants, Kaweah CA 93237-0051
  242. Ph: 209/561-4585, FAX: -4584
  243. PGP Key: finger -l ogawa@teleport.com
  244.  
  245. +++++++++++++++++++++++++++
  246.  
  247. >From spencerl@crl.com (Spencer Low)
  248. Date: Wed, 24 Aug 1994 16:45:44 -0800
  249. Organization: LowTek Creations
  250.  
  251. In article <94082408183600240@purple.com>, clio!jeff@vu-vlsi.ee.vill.edu wrote:
  252. >     A subspace error (-129937) has occurred. Please check
  253. >     this universe for consistency.
  254.  
  255. Of course, you could also include the following one (for you develop readers):
  256.  
  257.       A subspace error (-16.7 * 10^6) has occured. pi does *not*
  258.       equal 3.141592654. Please make sure your universe is in
  259.       existance.
  260.  
  261. Spencer
  262. ________________________________________________________________________
  263.   Spencer "MaxRAM" Low ------ LowTek Creations ----- spencerl@crl.com
  264.  
  265. +++++++++++++++++++++++++++
  266.  
  267. >From Manuel Veloso <veloso@netcom.com>
  268. Date: Fri, 26 Aug 1994 06:11:38 GMT
  269. Organization: Ibex Productions
  270.  
  271. In article <rtmd30-2308941345120001@pangaea.sps.mot.com> Greg Ferguson,
  272. rtmd30@email.sps.mot.com writes:
  273. >We're looking for some ideas for out-of-the-ordinary Alert messages.
  274.  
  275. Why not just use the simple, yet poignant,
  276.  
  277. "Whoops!"
  278.  
  279. or the more minimal message from mpw gcc
  280.  
  281. "Ack!"
  282.  
  283. or the ultimate testing message from Radiation,
  284.  
  285. "Warning! The radiation shield on your Macintosh has failed.
  286. Please step back 5 feet."
  287.  
  288. +++++++++++++++++++++++++++
  289.  
  290. >From goo@cwis.unomaha.edu (Kent Radek)
  291. Date: 27 Aug 94 03:19:27 GMT
  292. Organization: University of Nebraska Omaha
  293.  
  294. I once got a message like this in the CodeWarrior debugger:
  295.  
  296. "An error #-930 has occurred, because an error occurred."
  297.  
  298. goo
  299.  
  300. +++++++++++++++++++++++++++
  301.  
  302. >From reinder@neuretp.biol.ruu.nl (Reinder Verlinde)
  303. Date: Wed, 31 Aug 1994 14:41:13 GMT
  304. Organization: Rijksuniversiteit Utrecht
  305.  
  306. How about:
  307.  
  308.   "The item <name> could not be deleted because it doesn't exist"
  309.  
  310. (Macintosh Finder)
  311.  
  312. or:
  313.  
  314.   "numeric constant too long (> 255 characters)"
  315.  
  316. (MPW C++)
  317.  
  318.   "too many errors on one line. Use fewer"
  319.   "This union already has a perfectly good definition"
  320.   "This struct already has a perfectly good definition"
  321.   "This array has no size, and that's bad"
  322.   "Only one parameter per register please"
  323.   "a typedef name was a complete surprise to me at this point in your
  324. program"
  325.   "type in (cast) must be scalar; ANSI 3.3.4; page 39, lines 10-11 (I
  326. know
  327.    you don't care, I'm just trying to annoy you)"
  328.   "Call me paranoid but finding '/*' inside this comment makes me
  329. suspicious"
  330.   "Trailing comma not permitted in enum definition.  (This time I'm
  331. letting
  332.    you off with a warning)"
  333.   "This function has an explicit return type and deserves a return
  334. value"
  335.   "...And the lord said, 'lo, there shall only be case or default
  336. labels
  337.    inside a switch statement'"
  338.   "Symbol table full - fatal heap error; please go buy a RAM upgrade
  339. from
  340.    your local Apple dealer"
  341.   "String literal too long (I let you have 512 characters, that's 3
  342. more than
  343.    ANSI said I should)"
  344.   "This label is the target of a goto from outside of the block
  345. containing
  346.    this label AND this block has an automatic variable with an
  347. initializer
  348.    AND your window wasn't wide enough to read this whole error message"
  349.  
  350. (all from MPW C)
  351.  
  352. reinder@neuretp.biol.ruu.nl (Reinder Verlinde)
  353.  
  354. +++++++++++++++++++++++++++
  355.  
  356. >From deanp@zikzak.apana.org.au (Dean Perry)
  357. Date: 4 Sep 1994 04:29:15 GMT
  358. Organization: Zikzak public access UNIX, Melbourne Australia
  359.  
  360. Greg Ferguson (rtmd30@email.sps.mot.com) wrote:
  361.  
  362. : We're looking for some ideas for out-of-the-ordinary Alert messages.
  363.  
  364. This one, hijacked from an old (85?) BMUG newsletter (ish)
  365.  
  366. "Really spin the hard disk at 90000 rpm?"
  367.  
  368. <YES>   <MAYBE>
  369.  
  370.  
  371. dean
  372. --
  373.         Zikzak public access UNIX, Melbourne, Australia.
  374.  
  375. +++++++++++++++++++++++++++
  376.  
  377. >From deanp@zikzak.apana.org.au (Dean Perry)
  378. Date: 5 Sep 1994 14:22:48 GMT
  379. Organization: Zikzak public access UNIX, Melbourne Australia
  380.  
  381. Or this cutie, from MacApp this evening:
  382.  
  383. Could not complete the command "x" because "class", an internal component 
  384. is missing.  Call Apple for a secret decoder ring.
  385.  
  386. dean (again)
  387. --
  388.         Zikzak public access UNIX, Melbourne, Australia.
  389.  
  390. ---------------------------
  391.  
  392. >From steven.webber@digitec.co.za (Steven Webber) 
  393. Subject: Goto Pro's and Con's
  394. Date: 23 Aug 94 23:21:00 GMT
  395. Organization: Digitec Online
  396.  
  397. Hi there.
  398.  
  399. I've got a question for all you programmers out there. 
  400.  
  401. Do you use goto's in your code?  
  402.  
  403. Do you think using Goto's is a bad or good idea?
  404.  
  405. Why do you like/dislike using them?
  406.  
  407. Everybodies ideas would be most welcome.
  408.  
  409. Thanks 
  410. Steven.
  411.  
  412. Steven.Webber@Digitec.co.za
  413. ___ Blue Wave/QWK v2.12 OS/2
  414.  
  415. - --
  416. - - Digitec Online --- Johannesburg, South Africa --- tel +27 11 476-2008 ---
  417. - - You can TELNET Africa's biggest and most popular BBS on 196.11.62.106 ---
  418.  
  419. +++++++++++++++++++++++++++
  420.  
  421. >From s3026557@titanic.mpce.mq.edu.au (Duncan Anker)
  422. Date: 24 Aug 1994 10:04:44 GMT
  423. Organization: Macquarie University, School of Mathematics, Physics, Computing and Electronics
  424.  
  425. Steven Webber (steven.webber@digitec.co.za) wrote:
  426. : Hi there.
  427.  
  428. : I've got a question for all you programmers out there. 
  429.  
  430. : Do you use goto's in your code?  
  431.  
  432. : Do you think using Goto's is a bad or good idea?
  433.  
  434. : Why do you like/dislike using them?
  435.  
  436. : Everybodies ideas would be most welcome.
  437.  
  438. Thou shalt not use gotos. Neither shalt thou abolish them entirely.
  439.  
  440. Personally, I don't use them, although they can be useful when escaping
  441. from error situations in deeply nested code (or so I've heard).
  442.  
  443. If you find yourself using gotos, consider rewriting your functions. :-)
  444.  
  445. cheers.
  446.  
  447. --
  448. s3026557@titanic.mpce.mq.edu.au * Duncan Anker * e3026557@hardy.ocs.mq.edu.au
  449.  
  450. If you're a horse, and someone gets on you, and falls off, and then gets right
  451. back on you, I think you should buck him off right away.
  452.  
  453. +++++++++++++++++++++++++++
  454.  
  455. >From eascharf@u.washington.edu (Elizabeth Scharf)
  456. Date: 24 Aug 1994 13:59:22 GMT
  457. Organization: University of Washington, Seattle
  458.  
  459. I am fairly partial to break/continue statements for making loop 
  460. execution easier to read.  I also use goto for error handling in some 
  461. routines, but with several restrictions, like only one label per routine 
  462. called "CleanUp:" and only one return point which is after CleanUp.  I 
  463. try to write code that can determine its error state and what needs 
  464. cleaning up at the end so as to make the goto basically like the end of a 
  465. bunch of if statements, but without the code waterfall.  Other than that, 
  466. I try to avoid them because they make things harder to read and maintain.
  467.  
  468. Donald Knuth presents several examples where using gotos are beneficial, 
  469. usually for algorithm optomization (see Knuth, "Literate Programming")  A 
  470. good read in any case.
  471.  
  472. rmgw
  473.  
  474. This is not my account:  Please address replies to hawkfish@aol.com
  475.  
  476. Disclaimer:  All views expressed are entirely my own and do not reflect 
  477. the opinions of Elizabeth Scharf or the University of Washington.
  478.  
  479. - ---------------------------------------------------------------------------
  480. Richard Wesley             | "No, No No, 'Eureka' is Greek; it means 'This
  481. hawkfish@aol.com           |  bath is too hot'"
  482. 71062.1711@compuserve.com  |                      - Dr. Who
  483. - ---------------------------------------------------------------------------
  484.  
  485.  
  486. +++++++++++++++++++++++++++
  487.  
  488. >From dennis@mr2.ece.cmu.edu (Dennis J. Ciplickas)
  489. Date: 24 Aug 1994 14:25:39 GMT
  490. Organization: Electrical and Computer Engineering, Carnegie Mellon
  491.  
  492.  
  493. In article <300.310.uupcb@digitec.co.za> steven.webber@digitec.co.za (Steven Webber)  writes:
  494. >Hi there.
  495. >I've got a question for all you programmers out there. 
  496. >Do you use goto's in your code?  
  497. >Do you think using Goto's is a bad or good idea?
  498. >Why do you like/dislike using them?
  499.  
  500. (You didn't specify which language you were thinking about, but I'll
  501. assume C.)  I regularly use an "error exit" goto construct in my C
  502. code because it's just too damn difficult to unravel yourself at each
  503. point where you might need to exit.  A common example is in a routine
  504. that must allocate a few different items, and if any one of them fails
  505. you complain to the user and quit.  For example:
  506.  
  507. OSErr Allocater(void)
  508. {
  509.   OSErr err;
  510.   Handle h1,h2;
  511.   Ptr p1,p2;
  512.  
  513.   // null out our block pointers so that if we have to leave
  514.   // prematurely, only those that actually got allocated get
  515.   // deallocated.
  516.   h1 = h2 = NULL;
  517.   p1 = p2 = NULL;
  518.  
  519.   // now allocate all the blocks
  520.   if (!(h1 = NewHandle(10))) {
  521.     err = MemError();
  522.     showerror(1,"Memory Error %d allocating h1.");
  523.     goto errexit;
  524.     }
  525.  
  526.   if (!(h2 = NewHandle(20))) {
  527.     err = MemError();
  528.     showerror(1,"Memory Error %d allocating h2.");
  529.     goto errexit;
  530.     }
  531.  
  532.   if (!(p1 = NewPtr(10))) {
  533.     err = MemError();
  534.     showerror(1,"Memory Error %d allocating p1.");
  535.     goto errexit;
  536.     }
  537.  
  538.   if (!(p2 = NewPtr(10))) {
  539.     err = MemError();
  540.     showerror(1,"Memory Error %d allocating p2.");
  541.     goto errexit;
  542.     }
  543.  
  544.   // then do some work.
  545.   ...
  546.   if (err = DoSomethingElse(h1,h2)) goto errexit;
  547.   ...
  548.   err = noErr;
  549.  
  550.   // deallocate and leave
  551.  
  552. errexit:
  553.   if (h1) DisposHandle(h1);
  554.   if (h2) DisposHandle(h2);
  555.   if (p1) DisposPtr(p1);
  556.   if (p2) DisposPtr(p2);
  557.  
  558.   return err;
  559. }
  560.  
  561. -Dennis
  562.  
  563. +++++++++++++++++++++++++++
  564.  
  565. >From pcastine@prz.tu-berlin.de (Peter Castine)
  566. Date: Wed, 24 Aug 1994 15:24:35 GMT
  567. Organization: Process Control Center
  568.  
  569. In article <300.310.uupcb@digitec.co.za>, steven.webber@digitec.co.za
  570. (Steven Webber) wrote:
  571.  
  572. > Hi there.
  573. > I've got a question for all you programmers out there. 
  574. > Do you use goto's in your code?  
  575. > Do you think using Goto's is a bad or good idea?
  576. > Why do you like/dislike using them?
  577. > Everybodies ideas would be most welcome.
  578.  
  579. Haven't used a goto since I stopped programming in BASIC (which was when I
  580. bought my own Mac in '86). Actually, the last BASIC I used (BBC BASIC on
  581. an Acorn Beeb) let me avoid GOTOs _almost_ entirely, so add a few years.
  582.  
  583. The problems with GOTO are discussed thoroughly in Anthony Hoare's seminal
  584. paper ``GOTO cosidered dangerous'' (Sorry, I don't have the complete
  585. reference) and in every book on structured programming techniques written
  586. since.
  587.  
  588. Essentially, there is nothing you can do with GOTO you can't do with
  589. procedure calls, stuctured loops, and if-then-else constructs. Structured
  590. code is generally easier to read and understand (and, hence, easier to
  591. modify without causing it to stop working). There are some exceptional
  592. situations where GOTOs may make sense (C's break, continue, and exit
  593. statements are semi-structured GOTOs in disguise; in other languages you
  594. might use a GOTO where you'd see a break in C).
  595.  
  596. -- 
  597. Peter Castine               | C (n.): A programming language that is sort of
  598. pcastine@prz.tu-berlin.de   | like Pascal except more like assembly except
  599. Process Control Center      | that it isn't very much like either one, or
  600. Technical University Berlin | anything else.                  -- Ray Simard
  601.  
  602. +++++++++++++++++++++++++++
  603.  
  604. >From Darrin Cardani <Darrin.Cardani@AtlantaGA.NCR.COM>
  605. Date: Wed, 24 Aug 1994 13:31:38 GMT
  606. Organization: AT&T Global Information Solutions, Atlanta
  607.  
  608. >In article <300.310.uupcb@digitec.co.za> Steven Webber writes: 
  609. >Hi there.
  610. >
  611. >I've got a question for all you programmers out there. 
  612. >
  613. >Do you use goto's in your code?  
  614.  
  615. Occasionally. The only time I really use them (well, in non-BASIC programming ;)
  616. is for error handling. I often have a set of Sound Manager
  617. calls that look something like this:
  618.  
  619. {
  620.    SndError = SndManagerCall1 (blah);
  621.    if (SndError != noError)
  622.      goto Cleanup;
  623.  
  624.    SndError = SndManagerCall2 (blah);
  625.    if (SndError != noError)
  626.       goto Cleanup;
  627.  
  628. ..etc...
  629.  
  630.    return (noError);
  631.  
  632.    Cleanup:
  633.       <Several lines of cleanup code, and return an error>
  634. }
  635.  
  636. >Do you think using Goto's is a bad or good idea?
  637.  
  638. In general I use the control structures provided by the
  639. language since that's what they were made for. They're
  640. a bad idea if they obscure your code and don't add anything
  641. to it. I think in the above, it saves space and is pretty clear.
  642.  
  643. Darrin
  644.  
  645.  
  646.  
  647.  
  648.  
  649.  
  650.  
  651. +++++++++++++++++++++++++++
  652.  
  653. >From jwbaxter@olympus.net (John W. Baxter)
  654. Date: Wed, 24 Aug 1994 08:17:32 -0700
  655. Organization: Internet for the Olympic Peninsula
  656.  
  657. In article <300.310.uupcb@digitec.co.za>, steven.webber@digitec.co.za
  658. (Steven Webber) wrote:
  659.  
  660. > Hi there.
  661. > I've got a question for all you programmers out there. 
  662. > Do you use goto's in your code?  
  663.  
  664. I use them when I feel they are the cleanest solution to a dirty problem. 
  665. As Sean mentioned, error handling can be one such, in a language such as
  666. see which doesn't provide something better.  C++ with exceptions offers
  667. something better...too bad it doesn't exist yet in many compilers.
  668.  
  669. > Do you think using Goto's is a bad or good idea?
  670. > Why do you like/dislike using them?
  671.  
  672. The cost of software is more in the maintenance than in the original
  673. coding.  Uncontrolled use of gotos usually makes the maintenance more
  674. expensive (and sometimes essentially impossible:  it's cheaper to start
  675. fresh), because it tends to make the code hard to read (for a human...the
  676. compiler does fine).  On the other hand, dirty tricks to avoid gotos has a
  677. similar effect...the code is hard to maintain.
  678.  
  679. But what do I know???...I've only been doing this since the late 1950s
  680. (and not continuously during that time).
  681.    --John
  682.  
  683. -- 
  684. John Baxter    Port Ludlow, WA, USA  [West shore, Puget Sound]
  685.    "Occasionally...astronomers add a second to either June 31 or
  686.     December 31..."   IM: OS Utilities, p 4-12
  687.    jwbaxter@pt.olympus.net
  688.  
  689. +++++++++++++++++++++++++++
  690.  
  691. >From h+@nada.kth.se (Jon W{tte)
  692. Date: Wed, 24 Aug 1994 23:10:27 +0200
  693. Organization: Royal Institute of Something or other
  694.  
  695. In article <300.310.uupcb@digitec.co.za>,
  696. steven.webber@digitec.co.za (Steven Webber)  wrote:
  697.  
  698. >Do you use goto's in your code?  
  699.  
  700. Yes.
  701.  
  702. >Do you think using Goto's is a bad or good idea?
  703. >Why do you like/dislike using them?
  704.  
  705. Sometimes they help structure code immensely, like when you 
  706. test for pre-conditions and want to take an early exit, but 
  707. still clean up stuff. Also for "retry" kinds of things it's 
  708. much simpler and easier on the eyes with a strategically-placed 
  709. goto.
  710.  
  711. C++ stack-based objects help reduce gotos, but not eliminate 
  712. them totally.
  713.  
  714. The controversy these days is on non-local gotos, like 
  715. longjmp() and C++ try/catch exceptions. I tend to like these as 
  716. well, but they _do_ add a need for careful structuring in order 
  717. to be used cleanly and effectively.
  718.  
  719.  
  720.  
  721.  
  722. --
  723.   Jon Wätte (h+@nada.kth.se), Hagagatan 1, 113 48 Stockholm, Sweden
  724.  "Don't use the Layer Manager"
  725.  
  726.  
  727. +++++++++++++++++++++++++++
  728.  
  729. >From bootstrap1@aol.com (Bootstrap1)
  730. Date: 24 Aug 1994 17:40:16 -0400
  731. Organization: America Online, Inc. (1-800-827-6364)
  732.  
  733. In article <DENNIS.94Aug24102539@mr2.ece.cmu.edu>, dennis@mr2.ece.cmu.edu
  734. (Dennis J. Ciplickas) writes:
  735.  
  736. > I regularly use an "error exit" goto construct in my C
  737. > code because it's just too damn difficult to unravel yourself at each
  738. > point where you might need to exit.  A common example is in a routine
  739. > that must allocate a few different items, and if any one of them fails
  740. > you complain to the user and quit.  For example:
  741.  
  742. While I think it is fine to use a goto construct in a well structured way
  743. such as you illustrate in your example, I still never use them myself.  As
  744. with using continue and break in loops and return in the middle of
  745. functions, I find it makes the flow of a function more difficult to
  746. follow.  Knowing that a function starts executing at the top and falls
  747. straight through all the way to the bottom makes debugging and reading
  748. code much easier, at least for me.  And you can still avoid having to
  749. unravel on reaching an error conditions, as well as the dreaded "code
  750. waterfall" someone else mentioned, without using gotos, as the following
  751. edit of your sample shows
  752.  
  753. OSErr Allocater(void) {
  754.   OSErr err;
  755.   Handle h1,h2;
  756.   Ptr p1,p2;
  757.  
  758.   // null out our block pointers so that if we have to leave
  759.   // prematurely, only those that actually got allocated get
  760.   // deallocated.
  761.   h1 = h2 = NULL;
  762.   p1 = p2 = NULL;
  763.  
  764.   h1 = NewHandle(10);
  765.   if ((err = MemError()) != noErr)
  766.     showerror(1,"Memory Error %d allocating h1.");
  767.  
  768.   if (err == noErr) {
  769.     h2 = NewHandle(20);
  770.     if ((err = MemError()) != noErr)
  771.       showerror(1,"Memory Error %d allocating h2.");
  772.   }
  773.  
  774.   if (err == noErr) {
  775.     p1 = NewPtr(10);
  776.     if ((err = MemError()) != noErr)
  777.       showerror(1,"Memory Error %d allocating p1.");
  778.   }
  779.  
  780.   if (err == noErr) {
  781.     p2 = NewPtr(10);
  782.     if ((err = MemError()) != noErr)
  783.       showerror(1,"Memory Error %d allocating p2.");
  784.   }
  785.  
  786.   // then do some work.
  787.   ...
  788.   if (err == noErr)
  789.     err = DoSomethingElse(h1,h2);
  790.  
  791.   if (err != noErr) {
  792.     // deallocate
  793.  
  794.     if (h1) DisposHandle(h1);
  795.     if (h2) DisposHandle(h2);
  796.     if (p1) DisposPtr(p1);
  797.     if (p2) DisposPtr(p2);
  798.   }
  799.  
  800.   return err;
  801. }
  802.  
  803.  
  804. +++++++++++++++++++++++++++
  805.  
  806. >From howard@netcom.com (Howard Berkey)
  807. Date: Wed, 24 Aug 1994 22:42:04 GMT
  808. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  809.  
  810. In article <300.310.uupcb@digitec.co.za>,
  811. Steven Webber <steven.webber@digitec.co.za> wrote:
  812. >Hi there.
  813. >
  814. >I've got a question for all you programmers out there. 
  815. >
  816. >Do you use goto's in your code?  
  817. >
  818.  
  819. Oh, about as often as longjmp()  :-)
  820.  
  821.  
  822. >Do you think using Goto's is a bad or good idea?
  823. >
  824.  
  825. I can think of very few situations that require them, if any.  One
  826. might be removal of recursion in a routine that would be uglier to do
  827. in any other way.  *might* be.  99% of the time continue or break
  828. work as well or better in the remaining situations.
  829.  
  830. >Why do you like/dislike using them?
  831. >
  832.  
  833. It decreases readability of your code, complicates flow, is ugly, and
  834. makes your co-workers laugh at you.  It makes bugs potentially harder
  835. to find.  It is usually done as a quick hack or kludge (IOW it
  836. probably introduces a new bug).  
  837.  
  838.  
  839. -H-
  840.  
  841.  
  842.  
  843. -- 
  844. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  845. Howard Berkey                                             howard@netcom.com   
  846. Segmentation Fault (core dumped)
  847.  
  848. +++++++++++++++++++++++++++
  849.  
  850. >From hulburt@leland.stanford.edu (Greg Payne)
  851. Date: 25 Aug 1994 02:29:26 GMT
  852. Organization: Stanford University
  853.  
  854. In article <300.310.uupcb@digitec.co.za>
  855. steven.webber@digitec.co.za (Steven Webber)  writes:
  856.  
  857. > Hi there.
  858. > I've got a question for all you programmers out there. 
  859. > Do you use goto's in your code?  
  860. > Do you think using Goto's is a bad or good idea?
  861. > Why do you like/dislike using them?
  862. > Everybodies ideas would be most welcome.
  863. > Thanks 
  864. > Steven.
  865.  
  866. Well, here is my 2 cents:
  867.  
  868. I personally dont use gotos (too many people said they
  869. were bad in all my cs classes).  I supposed they have 
  870. their place, but they can really make code hard to 
  871. understand.  I translated an airfoil code from fortran
  872. to c, and it really wasn't documented too well.  I did
  873. know most of the general method, through, but it was
  874. a real pain going through goto-loops that wandered all over
  875. the place to do the same thing a switch or if then else
  876. in c.  Unless it is to get out of a deeply nest loop
  877. or for error-handling, I'd say they are probably bad 
  878. programming.
  879.  
  880. Greg Payne
  881. greg@aerometrics.com
  882.  
  883. +++++++++++++++++++++++++++
  884.  
  885. >From Bruce@hoult.actrix.gen.nz (Bruce Hoult)
  886. Date: Thu, 25 Aug 1994 19:18:17 +1200 (NZST)
  887. Organization: (none)
  888.  
  889. steven.webber@digitec.co.za (Steven Webber)  writes:
  890. > I've got a question for all you programmers out there. 
  891. > Do you use goto's in your code?  
  892.  
  893. In assembler: all the time.
  894. In C or Pascal:  I don't remember the last time.  10 years ago?  You
  895. don't need them.
  896.  
  897. -- Bruce
  898.  
  899. +++++++++++++++++++++++++++
  900.  
  901. >From radixinc@aol.com (RadixInc)
  902. Date: 25 Aug 1994 15:53:01 -0400
  903. Organization: America Online, Inc. (1-800-827-6364)
  904.  
  905. In article <2860687096@hoult.actrix.gen.nz>, Bruce@hoult.actrix.gen.nz
  906. (Bruce Hoult) writes:
  907.  
  908. <<I've got a question for all you programmers out there. 
  909.  
  910. Do you use goto's in your code? >>
  911.  
  912. In C, I use goto once in a while for one purpose only: to get out of a
  913. loop or deep if... structure when something awful happens. I used to write
  914. the gotos myself, but I've been using the exception-handling macros that
  915. were in a "d e v e l o p" article a few issues back, and they look like
  916. function calls, even though they turn into gotos. If I had real exception
  917. handling I wouldn't need to use goto at all, though there is something
  918. nice about having the error handling and recovery/cleanup code in the same
  919. function that generates the error.
  920.  
  921. I used gotos once before to write a state-machine parser, but again I had
  922. macros to hide the goto/label stuff. This technique was discussed in
  923. "Computer Language" magazine, May 1991, and it worked out very well.
  924.  
  925. There are times when goto is the best and cleanest way to do something,
  926. but you have to discipline yourself to use goto only when you are
  927. convinced that there is no cleaner way to go. I've yet to see a decent C
  928. programmer use goto in the offhand way a lot of BASIC programmers use it.
  929.  
  930. A lot of the anti-goto sentiment comes out of Wirth's article "GOTO
  931. considered harmful," and he was referring to languages current at the
  932. time: PL/I, Fortran, and most of all BASIC. The typical Pascal book
  933. (including Wirth's) rail against goto, but he also acknowledges the (rare)
  934. necessity of it, because Pascal does after all implement goto. For
  935. example, removing tail recursion from algorithms like Quicksort is
  936. arguably best done with a goto, even in Pascal. (Of course there are other
  937. ways to do this; please don't assail me with goto-less Quicksorts). Wirth
  938. is right about the careless and unnecessary use of goto common in Fortran,
  939. BASIC, and PL/I, but those languages don't (or didn't at the time) have
  940. the control structures needed to obviate the use of goto. In modern
  941. languages, and modern implementations of Fortran and BASIC, the goto is
  942. mostly unnecessary, as it is in C and Pascal.
  943.  
  944. Gregory Jorgensen
  945. Radix Consulting Inc.
  946.  
  947.  
  948. +++++++++++++++++++++++++++
  949.  
  950. >From alexr@apple.com (Alexander M. Rosenberg)
  951. Date: Thu, 25 Aug 1994 21:26:02 GMT
  952. Organization: Hackers Anonymous
  953.  
  954. In article <300.310.uupcb@digitec.co.za>, steven.webber@digitec.co.za
  955. (Steven Webber) wrote:
  956.  
  957. > I've got a question for all you programmers out there. 
  958. > Do you use goto's in your code?  
  959. > Do you think using Goto's is a bad or good idea?
  960. > Why do you like/dislike using them?
  961.  
  962. Read Literate Programming by Donald Knuth. It includes an updated version
  963. of an old paper of his on this topic. I think that it should answer your
  964. questions quite nicely. (And it explained all those stupid looping
  965. constructs that Pascal has.)
  966.  
  967. - -------------------------------------------------------------------------
  968. -  Alexander M. Rosenberg  - INTERNET: alexr@apple.com      - Yoyodyne    -
  969. -  330 Waverley St., Apt B - UUCP:ucbvax!apple!alexr        - Propulsion  -
  970. -  Palo Alto, CA 94301     -                                - Systems     -
  971. -  (415) 329-8463          - Nobody is my employer so       - :-)         -
  972. -  (408) 974-3110          - nobody cares what I say.       -             -
  973.  
  974. +++++++++++++++++++++++++++
  975.  
  976. >From Bruce@hoult.actrix.gen.nz (Bruce Hoult)
  977. Date: Fri, 26 Aug 1994 11:25:15 +1200 (NZST)
  978. Organization: (none)
  979.  
  980. bootstrap1@aol.com (Bootstrap1) writes:
  981. > While I think it is fine to use a goto construct in a well structured way
  982. > such as you illustrate in your example, I still never use them myself.  As
  983. > with using continue and break in loops and return in the middle of
  984. > functions, I find it makes the flow of a function more difficult to
  985. > follow.  Knowing that a function starts executing at the top and falls
  986. > straight through all the way to the bottom makes debugging and reading
  987. > code much easier, at least for me.  And you can still avoid having to
  988. > unravel on reaching an error conditions, as well as the dreaded "code
  989. > waterfall" someone else mentioned, without using gotos, as the following
  990. > edit of your sample shows
  991.  
  992. A agree with your points, but dislike all the extra testing of err (both in
  993. error and normal situations) in your solution, and you're *still* obscuring
  994. the main flow of control in the normal situation.
  995.  
  996. I much prefer a "block" that uses break to exit when there is an error.
  997. Yes, I read your comment about break, and disagree.
  998.  
  999. Unfortunately, C and Pascal don't have a construct with this purpose, but
  1000. one can easily be faked using "repeat until true" or "do { } while (0)"...
  1001.  
  1002. To further mangle this eample code:
  1003.  
  1004. OSErr Allocater(void) {
  1005.   OSErr err;
  1006.   Handle h1,h2;
  1007.   Ptr p1,p2;
  1008.  
  1009.   // null out our block pointers so that if we have to leave
  1010.   // prematurely, only those that actually got allocated get
  1011.   // deallocated.
  1012.   h1 = h2 = NULL;
  1013.   p1 = p2 = NULL;
  1014.   
  1015.   do { // once only for error checking
  1016.  
  1017.     h1 = NewHandle(10);
  1018.     if ((err = MemError()) != noErr){
  1019.      showerror(1,"Memory Error %d allocating h1."); break;
  1020.     }
  1021.   
  1022.     h2 = NewHandle(20);
  1023.     if ((err = MemError()) != noErr){
  1024.       showerror(1,"Memory Error %d allocating h2."); break;
  1025.     }
  1026.   
  1027.     p1 = NewPtr(10);
  1028.     if ((err = MemError()) != noErr){
  1029.       showerror(1,"Memory Error %d allocating p1."); break;
  1030.     }
  1031.   
  1032.     p2 = NewPtr(10);
  1033.     if ((err = MemError()) != noErr){
  1034.       showerror(1,"Memory Error %d allocating p2."); break;
  1035.     }
  1036.   
  1037.     // then do some work.
  1038.     ...
  1039.     err = DoSomethingElse(h1,h2);
  1040.      
  1041.   } while (0);
  1042.  
  1043.   if (err != noErr) {
  1044.     // deallocate
  1045.  
  1046.     if (h1) DisposHandle(h1);
  1047.     if (h2) DisposHandle(h2);
  1048.     if (p1) DisposPtr(p1);
  1049.     if (p2) DisposPtr(p2);
  1050.   }
  1051.  
  1052.   return err;
  1053. }
  1054.  
  1055. +++++++++++++++++++++++++++
  1056.  
  1057. >From Jaeger@fquest.com (Brian Stern)
  1058. Date: 26 Aug 1994 03:40:36 GMT
  1059. Organization: The University of Texas at Austin, Austin, Texas
  1060.  
  1061. In article <DENNIS.94Aug24102539@mr2.ece.cmu.edu>, dennis@mr2.ece.cmu.edu
  1062. (Dennis J. Ciplickas) wrote:
  1063.  
  1064. > In article <300.310.uupcb@digitec.co.za> steven.webber@digitec.co.za
  1065. (Steven Webber)  writes:
  1066. > >Hi there.
  1067. > >I've got a question for all you programmers out there. 
  1068. > >Do you use goto's in your code?  
  1069. > >Do you think using Goto's is a bad or good idea?
  1070. > >Why do you like/dislike using them?
  1071. > (You didn't specify which language you were thinking about, but I'll
  1072. > assume C.)  I regularly use an "error exit" goto construct in my C
  1073. > code because it's just too damn difficult to unravel yourself at each
  1074. > point where you might need to exit.  A common example is in a routine
  1075. > that must allocate a few different items, and if any one of them fails
  1076. > you complain to the user and quit.  For example:
  1077. [code chopped]
  1078. > -Dennis
  1079.  
  1080. The fact is that memerrors aren't fatal.  there's nothing wrong with
  1081. something like the following:
  1082.  
  1083. OSErr Allocater(void)
  1084. {
  1085.   OSErr err;
  1086.   Handle h1,h2;
  1087.   Ptr p1,p2;
  1088.  
  1089.    h1 = NewHandle( 10 );
  1090.    h2 = NewHandle( 20 );
  1091.    p1 = NewPtr( 10 );
  1092.    p2 = NewPtr( 10 );
  1093.  
  1094.    if ( noErr != ( err = MemError() ) )
  1095.      {
  1096.          // then do some work.
  1097.      }
  1098.    else
  1099.    {
  1100.       //report your errors
  1101.    }
  1102.  
  1103.   if ( h1 ) DisposHandle( h1 );
  1104.   if ( h2 ) DisposHandle( h2 );
  1105.   if ( p1 ) DisposPtr( p1 );
  1106.   if ( p2 ) DisposPtr( p2 );
  1107.  
  1108.   return err;
  1109. }
  1110.  
  1111. While I won't categorically say that gotos are evil, I haven't used one
  1112. since I gave up Fortran.
  1113.  
  1114. -- 
  1115. Brian  Stern  :-{)}
  1116. Jaeger@fquest.com
  1117.  
  1118. +++++++++++++++++++++++++++
  1119.  
  1120. >From radixinc@aol.com (RadixInc)
  1121. Date: 26 Aug 1994 00:35:04 -0400
  1122. Organization: America Online, Inc. (1-800-827-6364)
  1123.  
  1124. In article <33isqt$sie@search01.news.aol.com>, radixinc@aol.com (RadixInc)
  1125. writes:
  1126.  
  1127. <<A lot of the anti-goto sentiment comes out of Wirth's article "GOTO
  1128. considered harmful,...>>
  1129.  
  1130. As one polite person pointed out to me by email, the paper "GOTO
  1131. Considered Harmful" was written be Edsger Dijkstra, not Niklaus Wirth. I
  1132. always get them confused--they both have unpronouncable last names. I
  1133. believe Dijkstra's paper appeared in the CACM, but I don't have it. My
  1134. point remains the same, only that perhaps Dijkstra is a bit more adamant
  1135. about not using GOTO than Wirth.
  1136.  
  1137. Gregory Jorgensen
  1138. Radix Consulting Inc.
  1139.  
  1140. +++++++++++++++++++++++++++
  1141.  
  1142. >From radixinc@aol.com (RadixInc)
  1143. Date: 26 Aug 1994 02:59:05 -0400
  1144. Organization: America Online, Inc. (1-800-827-6364)
  1145.  
  1146. In article <DENNIS.94Aug24102539@mr2.ece.cmu.edu>, dennis@mr2.ece.cmu.edu
  1147. (Dennis J. Ciplickas) wrote:
  1148.  
  1149. << I regularly use an "error exit" goto construct in my C code because
  1150. it's just too damn difficult to unravel yourself at each point where you
  1151. might need to exit.>>
  1152.  
  1153. There's a good article in "d e v e l o p," August 1992, called "Living In
  1154. An Exceptional World" by Sean Parent. He proposes an elegant mechanism for
  1155. handling exceptions with macros, including clean-up and recovery. His
  1156. technique uses macros that resolve to gotos, but it keeps the source code
  1157. clean. I've been using these macros for a year or so, and I haven't had to
  1158. use an actual goto since. Check it out.
  1159.  
  1160. Gregory Jorgensen
  1161. Radix Consulting Inc.
  1162.  
  1163. +++++++++++++++++++++++++++
  1164.  
  1165. >From dennis@mr2.ece.cmu.edu (Dennis J. Ciplickas)
  1166. Date: 26 Aug 1994 16:07:46 GMT
  1167. Organization: Electrical and Computer Engineering, Carnegie Mellon
  1168.  
  1169. In article <33geo0$5h3@search01.news.aol.com> bootstrap1@aol.com (Bootstrap1) writes:
  1170. >In article <DENNIS.94Aug24102539@mr2.ece.cmu.edu>, dennis@mr2.ece.cmu.edu
  1171. >(Dennis J. Ciplickas) writes:
  1172. >> I regularly use an "error exit" goto construct in my C
  1173. >> code because it's just too damn difficult to unravel yourself at each
  1174. >> point where you might need to exit.  A common example is in a routine
  1175. >> that must allocate a few different items, and if any one of them fails
  1176. >> you complain to the user and quit.  For example:
  1177. >>[code deleted]
  1178. >
  1179. >While I think it is fine to use a goto construct in a well structured way
  1180. >such as you illustrate in your example, I still never use them myself.  As
  1181. >with using continue and break in loops and return in the middle of
  1182. >functions, I find it makes the flow of a function more difficult to
  1183. >follow.  Knowing that a function starts executing at the top and falls
  1184. >straight through all the way to the bottom makes debugging and reading
  1185. >code much easier, at least for me.  And you can still avoid having to
  1186. >unravel on reaching an error conditions, as well as the dreaded "code
  1187. >waterfall" someone else mentioned, without using gotos, as the following
  1188. >edit of your sample shows
  1189. >[code removed]
  1190.  
  1191. I understand your desire to keep the code readable, but in all
  1192. honesty, the sample code you provided was difficult to read.  Not to
  1193. mention it relies on the compiler to optimize away all of the
  1194. redundant checks on the err vaiarble.
  1195.  
  1196. To the original poster: in my mind, it comes down to this.  If using a
  1197. goto will make the code MORE readable and MORE maintainable, then go
  1198. for it.  If it will obscure the flow of the code then don't.  FORTRAN
  1199. did not give programmers good methods for dealing with code structure
  1200. (e.g. break, continue, etc.), only giving them the infamous GOTO to
  1201. implement such a flow.  Misuse of GOTO ended up obscuring the program
  1202. flow.
  1203.  
  1204. If I were to go out on a limb, I'd say that improper indentation makes
  1205. code unreadable (and hence more difficult to maintain) more than the
  1206. goto construct I presented.  (Of course, FORTRAN had stringent column
  1207. requirements, too, so it was also bogus in this respect.)
  1208.  
  1209. Just my $0.02.
  1210.  
  1211. -Dennis
  1212.  
  1213. +++++++++++++++++++++++++++
  1214.  
  1215. >From Kevin.R.Boyce@gsfc.nasa.gov (Kevin R. Boyce)
  1216. Date: Fri, 26 Aug 1994 12:47:08 -0400
  1217. Organization: NASA Goddard Space Flight Center -- Greenbelt, Maryland USA
  1218.  
  1219. In article <33jrdo$95h@search01.news.aol.com>,
  1220.  radixinc@aol.com (RadixInc) wrote:
  1221.  
  1222. >In article <33isqt$sie@search01.news.aol.com>, radixinc@aol.com (RadixInc)
  1223. >writes:
  1224. >
  1225. ><<A lot of the anti-goto sentiment comes out of Wirth's article "GOTO
  1226. >considered harmful,...>>
  1227. >
  1228. >As one polite person pointed out to me by email, the paper "GOTO
  1229. >Considered Harmful" was written be Edsger Dijkstra, not Niklaus Wirth. I
  1230. >always get them confused--they both have unpronouncable last names. I
  1231. >believe Dijkstra's paper appeared in the CACM, but I don't have it.
  1232.  
  1233. >From Jargon File 3.0.0:
  1234.  
  1235. :considered harmful: adj. Edsger W. Dijkstra's note in the
  1236.    March 1968 "Communications of the ACM", "Goto Statement
  1237.    Considered Harmful", fired the first salvo in the structured
  1238.    programming wars.  Amusingly, the ACM considered the resulting
  1239.    acrimony sufficiently harmful that it will (by policy) no longer
  1240.    print an article taking so assertive a position against a coding
  1241.    practice.  In the ensuing decades, a large number of both serious
  1242.    papers and parodies have borne titles of the form "X
  1243.    considered Y".  The structured-programming wars eventually blew
  1244.    over with the realization that both sides were wrong, but use of
  1245.    such titles has remained as a persistent minor in-joke (the
  1246.    `considered silly' found at various places in this lexicon is
  1247.    related).
  1248. -- 
  1249. Kevin      Kevin.R.Boyce@gsfc.nasa.gov
  1250. What may appear to the faint-hearted as a limitless expanse of God-forsaken wilderness is in reality a golden opportunity for ourselves, and our children, and our children's children, and the generations a-comin' to carve a new life out of the American Indian.  
  1251.       --Firesign Theatre
  1252.  
  1253. +++++++++++++++++++++++++++
  1254.  
  1255. >From walkerj@math.scarolina.edu (James W. Walker)
  1256. Date: 26 Aug 1994 17:25:30 GMT
  1257. Organization: Dept. of Mathematics, Univ. of South Carolina
  1258.  
  1259. In article <33k3rp$b4v@search01.news.aol.com>, radixinc@aol.com (RadixInc)
  1260. wrote:
  1261.  
  1262. > There's a good article in "d e v e l o p," August 1992, called "Living In
  1263. > An Exceptional World" by Sean Parent. He proposes an elegant mechanism for
  1264. > handling exceptions with macros, including clean-up and recovery. His
  1265. > technique uses macros that resolve to gotos, but it keeps the source code
  1266. > clean. I've been using these macros for a year or so, and I haven't had to
  1267. > use an actual goto since. Check it out.
  1268.  
  1269. I use those macros too.  However, I renamed his "nrequire" as "forbid".  I
  1270. find it easier to read actual English words.
  1271.  
  1272. -- 
  1273.  Jim Walker
  1274.  
  1275. +++++++++++++++++++++++++++
  1276.  
  1277. >From hanrek@cts.com (Mark Hanrek)
  1278. Date: 26 Aug 1994 18:31:38 GMT
  1279. Organization: The Information Workshop
  1280.  
  1281.  
  1282. If one is using a modern language, the "rule" to not use goto's is meaningless.
  1283.  
  1284. It was a rule meant to deter "spaghetti code", because it was so easy to
  1285. create a tangled web.  With today's languages, we create messes of a
  1286. different kind.
  1287.  
  1288. The right thing to do, regardless, is to imitate the constructs and
  1289. structuring we find in good example source code.
  1290.  
  1291. Whether we code a "break", a "try/catch", or "goto", we are doing it
  1292. because it is the appropriate thing to do.
  1293.  
  1294.  
  1295.  
  1296. Hope this helps.
  1297.  
  1298. Mark Hanrek
  1299.  
  1300. +++++++++++++++++++++++++++
  1301.  
  1302. >From urge@mcl.ucsb.edu (Scott Bronson)
  1303. Date: 27 Aug 1994 23:27:35 GMT
  1304. Organization: University of California, Santa Barbara
  1305.  
  1306. In <Jaeger-2508942242470001@slip-1-21.ots.utexas.edu> Jaeger@fquest.com (Brian Stern) writes:
  1307.  
  1308. >The fact is that memerrors aren't fatal.  there's nothing wrong with
  1309. >something like the following:
  1310.  
  1311. >   h1 = NewHandle( 10 );
  1312. >   h2 = NewHandle( 20 );
  1313. >   p1 = NewPtr( 10 );
  1314. >   p2 = NewPtr( 10 );
  1315.  
  1316. >   if ( noErr != ( err = MemError() ) ) { /* do something */ }
  1317.  
  1318.  
  1319. Well, there's nothing wrong with *your* code, but there's a serious
  1320. flaw in this technique.
  1321.  
  1322. What about this:
  1323.  
  1324. h1 = NewHandle( 30 ), h2 = NewHandle( 10 );
  1325.  
  1326. If there are 26 bytes of memory free, h2 will be a vaild handle and
  1327. MemError() is going to report noErr because the last memory allocation
  1328. succeeded.  However, h1 will be nil!  If you do your memory allocations
  1329. from smallest to largest, you will probably be OK.  However, heap
  1330. fragmentation can still cause some unexpected surprises when mixing
  1331. the allocation of pointers and handles.
  1332.  
  1333. So, even though this works, I hope that no programmers rely on it
  1334. unless they're sure they know EXACTLY what they're doing.  Personally,
  1335. I shun it--too much analysis on noncritical parts of my code gives me
  1336. a bad case of programmer burnout.
  1337.  
  1338.     - Scott                (urge@mcl.mcl.ucsb.edu)
  1339.  
  1340.  
  1341. +++++++++++++++++++++++++++
  1342.  
  1343. >From bb@lightside.com (Bob Bradley)
  1344. Date: Sat, 27 Aug 1994 02:24:40 -0800
  1345. Organization: SS Software Inc.
  1346.  
  1347. In <Jaeger-2508942242470001@slip-1-21.ots.utexas.edu> Jaeger@fquest.com
  1348. (Brian Stern) writes:
  1349.  
  1350. >The fact is that memerrors aren't fatal.  there's nothing wrong with
  1351. >something like the following:
  1352. >   h1 = NewHandle( 10 );
  1353. >   h2 = NewHandle( 20 );
  1354. >   p1 = NewPtr( 10 );
  1355. >   p2 = NewPtr( 10 );
  1356.  
  1357. >   if ( noErr != ( err = MemError() ) ) { /* do something */ }
  1358.  
  1359. If you don't have enough memory for the first one, you're still going to
  1360. try all the others. I would check for both the handle not being NULL and
  1361. that MemError() did not return anything but, noErr after each call to
  1362. NewHandle(...).
  1363.  
  1364. +++++++++++++++++++++++++++
  1365.  
  1366. >From ldo@waikato.ac.nz (Lawrence D'Oliveiro, Waikato University)
  1367. Date: 29 Aug 94 16:58:57 +1200
  1368. Organization: University of Waikato, Hamilton, New Zealand
  1369.  
  1370. In article <300.310.uupcb@digitec.co.za>, steven.webber@digitec.co.za (Steven Webber)  writes:
  1371. >
  1372. > Do you use goto's in your code?
  1373.  
  1374. Nope. I use Modula-2, which doesn't have goto's.
  1375.  
  1376. > Do you think using Goto's is a bad or good idea?
  1377.  
  1378. I think overall they're a poor idea, because it's so hard to spot any mistakes
  1379. that you make with them. But then, I also think exceptions are a poor idea--I
  1380. like being able to see the control flow in my program at a glance.
  1381.  
  1382. Modula-2 has this LOOP construct, which is basically an endless loop, within
  1383. which you have to put EXIT statements to exit, eg:
  1384.  
  1385.     LOOP
  1386.       (* do some cool stuff *)
  1387.     IF ExitCondition1 THEN
  1388.         EXIT
  1389.     END (*IF*);
  1390.       (* do more cool stuff *)
  1391.     IF ExitCondition2 THEN
  1392.         EXIT
  1393.     END (*IF*)
  1394.       (* and so on *)
  1395.     END (*LOOP*)
  1396.  
  1397. Modula-2 also has the usual WHILE, REPEAT and FOR loops, just like Pascal,
  1398. but I find that 90% of my loops are LOOP loops. This is because I frequently
  1399. need to check for error returns from system calls, and abort the loop if I
  1400. get one.
  1401.  
  1402. Furthermore, I frequently encounter the need to check for error returns during
  1403. a linear sequence of operations, not necessarily in a loop, and abort the
  1404. sequence at the point I hit the error. This gave me the idea for a loop-
  1405. statement-that-doesn't-loop. I fake this in Modula-2 something like this:
  1406.  
  1407.     InitStorage;
  1408.     LOOP (*once*)
  1409.     DoOSCall1;
  1410.     IF Err <> noErr THEN
  1411.         EXIT
  1412.     END (*IF*);
  1413.     DoOSCall2;
  1414.     IF Err <> noErr THEN
  1415.         EXIT
  1416.     END (*IF*);
  1417.       (* all done *)
  1418.     EXIT
  1419.     END (*LOOP*);
  1420.     DisposeStorage
  1421.  
  1422. "InitStorage" initializes all pointers to NIL, marks files as unopened etc,
  1423. and "DisposeStorage" goes through and disposes of all allocated pointers,
  1424. closes all open files and so on. By strictly adhering to this layout, it's
  1425. always easy to see where control will go in all situations.
  1426.  
  1427. Thought for the week: Testing is of limited help if you can't write correct
  1428. code to begin with.
  1429.  
  1430. Lawrence D'Oliveiro                       fone: +64-7-856-2889
  1431. Info & Tech Services Division              fax: +64-7-838-4066
  1432. University of Waikato            electric mail: ldo@waikato.ac.nz
  1433. Hamilton, New Zealand    37^ 47' 26" S, 175^ 19' 7" E, GMT+12:00
  1434.  
  1435. +++++++++++++++++++++++++++
  1436.  
  1437. >From dbenn@leven.appcomp.utas.edu.au (David Benn)
  1438. Date: Tue, 30 Aug 94 02:32:39 GMT
  1439. Organization: University of Tasmania
  1440.  
  1441. I don't know if anyone has mentioned this during the course of this thread,
  1442. but "The C Users Journal", June 1994 has an article called "Control
  1443. Structures" which discusses many of the issues that have cropped up in this
  1444. discussion.
  1445.  
  1446. The article is in on page 81 and is by Chuck Allison.
  1447.  
  1448. Rgds,
  1449.  
  1450. David Benn
  1451.  
  1452. -- 
  1453. D.Benn@appcomp.utas.edu.au - David Benn. University of Tasmania at Launceston.
  1454. The effort to understand the universe is one of the few things that lifts
  1455. human life above the level of farce, and gives it some of the grace of 
  1456. tragedy. (Steven Weinberg)
  1457.  
  1458. +++++++++++++++++++++++++++
  1459.  
  1460. >From dowdy@apple.com (Tom Dowdy)
  1461. Date: Wed, 31 Aug 1994 00:25:26 GMT
  1462. Organization: Apple Computer, Inc.
  1463.  
  1464. In article <33k3rp$b4v@search01.news.aol.com>, radixinc@aol.com (RadixInc)
  1465. wrote:
  1466.  
  1467. > In article <DENNIS.94Aug24102539@mr2.ece.cmu.edu>, dennis@mr2.ece.cmu.edu
  1468. > (Dennis J. Ciplickas) wrote:
  1469. > << I regularly use an "error exit" goto construct in my C code because
  1470. > it's just too damn difficult to unravel yourself at each point where you
  1471. > might need to exit.>>
  1472. > There's a good article in "d e v e l o p," August 1992, called "Living In
  1473. > An Exceptional World" by Sean Parent. He proposes an elegant mechanism for
  1474. > handling exceptions with macros, including clean-up and recovery. His
  1475. > technique uses macros that resolve to gotos, but it keeps the source code
  1476. > clean. I've been using these macros for a year or so, and I haven't had to
  1477. > use an actual goto since. Check it out.
  1478.  
  1479. I'd like to put another vote down for this style of handling...
  1480.  
  1481. Sean wrote these macros for us a *loooong* time ago, and they are
  1482. used in various parts of system software, including just about
  1483. all of the GX printing code.  In fact, a version of Exceptions.h
  1484. ships with the GX includes because we couldn't imagine the work
  1485. involved in un-"nrequire"ing the sample driver code.
  1486.  
  1487. These macros take a small amount to get used to, but once you've
  1488. got it, you'll find that you just about never fail to include some
  1489. level of error handling in your code (even if it's just simple
  1490. cleanup-exit type).
  1491.  
  1492. -- 
  1493.  Tom Dowdy                  Internet: dowdy@apple.COM
  1494.  Apple Computer MS:302-3KS  UUCP: {sun,voder,amdahl,decwrl}!apple!dowdy
  1495.  1 Infinite Loop            AppleLink: DOWDY1
  1496.  Cupertino, CA 95014       
  1497.  "The 'Ooh-Ah' Bird is so called because it lays square eggs."
  1498.  
  1499. +++++++++++++++++++++++++++
  1500.  
  1501. >From h+@nada.kth.se (Jon W{tte)
  1502. Date: Fri, 02 Sep 1994 09:18:45 +0200
  1503. Organization: Royal Institute of Something or other
  1504.  
  1505. In article <dowdy-3008941725260001@17.202.68.12>,
  1506. dowdy@apple.com (Tom Dowdy) wrote:
  1507.  
  1508. >all of the GX printing code.  In fact, a version of Exceptions.h
  1509. >ships with the GX includes because we couldn't imagine the work
  1510. >involved in un-"nrequire"ing the sample driver code.
  1511.  
  1512. Yes, and during the beta cycle, I pointed out that the name 
  1513. "Exceptions.h" collides with the same file name in the Think 
  1514. Class Library, and suggested changing the name to 
  1515. GXExceptions.h, since the Think Class Library is probably the 
  1516. most used Mac application framework.
  1517.  
  1518. THIS WAS PROMISED!
  1519.  
  1520. Of course it didn't happen.
  1521.  
  1522. Cheers,
  1523.  
  1524.                     / h+
  1525.  
  1526.  
  1527. --
  1528.   Jon Wätte (h+@nada.kth.se), Hagagatan 1, 113 48 Stockholm, Sweden
  1529.  
  1530.   Reality exists only in your imagination.
  1531.  
  1532.  
  1533. ---------------------------
  1534.  
  1535. >From jcd7106@tamsun.tamu.edu (John C. Daub)
  1536. Subject: Need help with saving-writing structs to a file.
  1537. Date: 3 Sep 1994 16:08:55 -0500
  1538. Organization: Texas A&M University, College Station
  1539.  
  1540.  
  1541. Hi :)  I'm having some trouble with trying to write stuff to a file.
  1542.  
  1543. My program is, essentially, a database.  The information the user enters
  1544. is saved in a struct (and linked list).  To illustrate, here's the
  1545. struct:
  1546.  
  1547. struct SongInfo
  1548. {
  1549.     Str255        title;
  1550.     Str255        artist;
  1551.     unsigned short    songTime;
  1552.     short        tempo;
  1553.     Boolean        isOriginal;
  1554.     Str255        songComments;
  1555.     Boolean        fitsGenCrit;
  1556.     short        listGen;
  1557.     short        menuItem;
  1558.     struct SongInfo *next, *prev;
  1559. };
  1560. typedef struct SongInfo SongInfo *SongInfoPtr;
  1561.  
  1562.  
  1563. >From what i can tell with my entering/editing functions, there seems
  1564. to be no problems with entering information nor with editing that
  1565. information (and even removing an entry).
  1566.  
  1567. But, when i try to save this information/structs/linked-list to a file,
  1568. I get all sorts of weird things (I open up the data fork, raw, in 
  1569. something like BBEdit Lite).
  1570.  
  1571. Here's my basic routine for trying to save:
  1572.  
  1573. (skip all the stuff about FSOpen(), Create(), SetEOF(), SetFPos(), etc).
  1574.  
  1575.  
  1576.     curPtr = gFirstSongInfoPtr;
  1577.  
  1578.     err = FSWrite( fRefNum, &(sizeof(SongInfo)), &curPtr );
  1579.     if ( err != noErr )
  1580.         return( err );
  1581.  
  1582.     curPtr = curPtr->next;
  1583.  
  1584. I also have a global to hold the offset...start at the beginning of the
  1585. file, add the one song, increase the offset global by sizeof(SongInfo),
  1586. then go back and repeat this until you get to the end of it all.
  1587.  
  1588. Now, i wonder if i'm doing something wrong with checking for curPtr->next = NIL
  1589. and then letting this while loop for the FSWrite() go too long, or what.
  1590.  
  1591. I've seen sample source that does this same sort of thing, and it works
  1592. fine there, but why not here?
  1593.  
  1594. One time, i ended up with parts of the database info, then i got half of
  1595. a source file in there (don't ask me how).
  1596.  
  1597. Could it be something to do with using Pascal strings?  Would it help
  1598. to perhaps save each part of the struct on it's own...like convert
  1599. the pascal strings to C strings (read them into an array or something),
  1600. enter that, then move to the next struct member, write that, then the
  1601. next, write that...each time increasing the offest by sizeof(variable)?
  1602.  
  1603. Any help in writing structs to a file would be greatly appreaciated :)
  1604.  
  1605. pleae email to:  hsoi@tamu.edu
  1606.  
  1607. thanx, John
  1608.  
  1609. +++++++++++++++++++++++++++
  1610.  
  1611. >From decartwr@newstand.syr.edu (Dana Cartwright 3rd)
  1612. Date: 3 Sep 1994 22:10:46 GMT
  1613. Organization: Syracuse University, Syracuse NY, USA
  1614.  
  1615. John C. Daub (jcd7106@tamsun.tamu.edu) wrote:
  1616.  
  1617. : But, when i try to save this information/structs/linked-list to a file,
  1618. : I get all sorts of weird things (I open up the data fork, raw, in 
  1619. : something like BBEdit Lite).
  1620.  
  1621. I try to avoid writing structs directly to files.  For at least two
  1622. reasons.  First, structs are compiled differently by different
  1623. compilers...that is, the compiler is free to add padding here and
  1624. there in structs to maintain data alignment.  So if you write a
  1625. struct to a file, there's a goodly chance you're writing more bytes
  1626. than you might imagine just from a visual inspection of the
  1627. struct, and if you re-compile your code with a different compiler
  1628. (even from the same company), you might no longer be able to read
  1629. back your older files.
  1630.  
  1631. Second, if you want any kind of cross-platform compatibility, you
  1632. have "little-endian" versus "big-endian" (basically, the order of
  1633. bytes within multi-byte numbers) issues, which are most easily 
  1634. dealt with by exercising VERY tight control over the way data is
  1635. read/written.  Hard to do that when you let the compiler dictate 
  1636. how your data is laid out.
  1637.  
  1638. I'm guessing here, but I would not be at all surprised if structs
  1639. were sometimes different on 68K versus PPC compilers.
  1640.  
  1641. So one way to "solve" your problem would be to more precisely control
  1642. your file format, which would also probably resolve some of the
  1643. problems you mention in your post.
  1644.  
  1645.  
  1646. +++++++++++++++++++++++++++
  1647.  
  1648. >From afcjlloyd@aol.com (AFC JLloyd)
  1649. Date: 3 Sep 1994 18:50:03 -0400
  1650. Organization: America Online, Inc. (1-800-827-6364)
  1651.  
  1652. In article <34aol7$p4u@tamsun.tamu.edu>, jcd7106@tamsun.tamu.edu (John C.
  1653. Daub) writes:
  1654.  
  1655. >Hi :)  I'm having some trouble with trying to write stuff to a file.
  1656. >
  1657. >[ some stuff omitted ]
  1658. >
  1659. >Here's my basic routine for trying to save:
  1660. >
  1661. >(skip all the stuff about FSOpen(), Create(), SetEOF(), SetFPos(), etc).
  1662. >
  1663. > curPtr = gFirstSongInfoPtr;
  1664. >
  1665. > err = FSWrite( fRefNum, &(sizeof(SongInfo)), &curPtr );
  1666.  
  1667. This FSWrite statement has two problems.  You should rewrite it like this:
  1668.  
  1669. long bytesWritten = sizeof(SongInfo);
  1670. err = FSWrite( fRefNum, &bytesWritten, curPtr );
  1671.  
  1672. It's not a good idea to pass an address of a compiler generated constant
  1673. to a function that will write into the address.  And if you want to write
  1674. out a set of bytes starting at an address, pass the
  1675. value of that address, not the address of a pointer that points to the
  1676. desired address.
  1677.  
  1678. Jim Lloyd
  1679. afcjlloyd@aol.com
  1680.  
  1681.  
  1682. +++++++++++++++++++++++++++
  1683.  
  1684. >From bb@lightside.com (Bob Bradley)
  1685. Date: Fri, 02 Sep 1994 17:42:28 -0800
  1686. Organization: SS Software Inc.
  1687.  
  1688. In article <34as96$hh3@newstand.syr.edu>, decartwr@mailbox.syr.edu wrote:
  1689.  
  1690. > I try to avoid writing structs directly to files.  For at least two
  1691. > reasons.  First, structs are compiled differently by different
  1692. > compilers...that is, the compiler is free to add padding here and
  1693. > there in structs to maintain data alignment.  So if you write a
  1694. > struct to a file, there's a goodly chance you're writing more bytes
  1695. > than you might imagine just from a visual inspection of the
  1696. > struct, and if you re-compile your code with a different compiler
  1697. > (even from the same company), you might no longer be able to read
  1698. > back your older files.
  1699.  
  1700. I wasn't aware of the problems that can arise when reading/writing structs
  1701. to a file, how can I change my code to fix the problems?
  1702.  
  1703. I typically have something like:
  1704.  
  1705. typedef struct
  1706. {
  1707.     short               shortNumber;
  1708.     FSSpec              spec;
  1709.  
  1710. }   MyRecord;
  1711.  
  1712. And I write that whole structure to disk. In order to do things correctly
  1713. (to elminate the problems mentioned above) do I have to write each field
  1714. of the structure individually? I frequently have structures inside of
  1715. structures and I also save some Apple defined structures to disk, is there
  1716. any way to fix the problem when you don't actually know the format of the
  1717. structure (ie. I wouldn't be able to save each individual field)?
  1718.  
  1719. +++++++++++++++++++++++++++
  1720.  
  1721. >From vanderHarg@DIMES.TUDelft.NL (Arthur van der Harg)
  1722. Date: Sun, 4 Sep 1994 12:16:54 GMT
  1723. Organization: Hardly
  1724.  
  1725. In article <34as96$hh3@newstand.syr.edu>, decartwr@mailbox.syr.edu wrote:
  1726.  
  1727. > I'm guessing here, but I would not be at all surprised if structs
  1728. > were sometimes different on 68K versus PPC compilers.
  1729.  
  1730. Or between differently compiled versions on 68k. SC++ 7.x lets you choose
  1731. field alignment to 1, 2 or 4-byte boundaries. So if you have a field with
  1732. an odd or non-mod4 number of bytes, the structure will be aligned
  1733. differently for different compiler *settings*, let alone different
  1734. compilers or different architectures.
  1735.  
  1736. Arthur
  1737.  
  1738. -- 
  1739. This message (c) Arthur van der Harg <vanderHarg@DIMES.TUDelft.nl>
  1740.  
  1741. +++++++++++++++++++++++++++
  1742.  
  1743. >From parkb@bigbang.Stanford.EDU (Brian Park)
  1744. Date: 5 Sep 1994 07:31:25 GMT
  1745. Organization: Stanford University
  1746.  
  1747. Dana Cartwright 3rd <decartwr@mailbox.syr.edu> wrote:
  1748. >I try to avoid writing structs directly to files.  For at least two
  1749. >reasons.  First, structs are compiled differently by different
  1750. >compilers...
  1751. [...]
  1752. >Second, if you want any kind of cross-platform compatibility, you
  1753. >have "little-endian" versus "big-endian" 
  1754. [...]
  1755.  
  1756. Resource Manager writes structures to files... doesn't it?
  1757.  
  1758. --
  1759. Brian Park
  1760. parkb@bigbang.stanford.edu
  1761.  
  1762. +++++++++++++++++++++++++++
  1763.  
  1764. >From hanrek@cts.com (Mark Hanrek)
  1765. Date: Mon, 5 Sep 1994 08:08:27 GMT
  1766. Organization: The Information Worskhop
  1767.  
  1768. In article <34aol7$p4u@tamsun.tamu.edu>, jcd7106@tamsun.tamu.edu (John C.
  1769. Daub) wrote:
  1770.  
  1771. > Hi :)  I'm having some trouble with trying to write stuff to a file.
  1772. > My program is, essentially, a database.  The information the user enters
  1773. > is saved in a struct (and linked list).  
  1774. >
  1775. > [ stuff deleted ]
  1776. > From what i can tell with my entering/editing functions, there seems
  1777. > to be no problems with entering information nor with editing that
  1778. > information (and even removing an entry).
  1779. > But, when i try to save this information/structs/linked-list to a file,
  1780. > I get all sorts of weird things (I open up the data fork, raw, in 
  1781. > something like BBEdit Lite).
  1782.  
  1783. John,
  1784.  
  1785. You didn't mention exactly how you are determining that something is wrong.  
  1786.  
  1787. Do things appear "wierd" only when you look at it with BBEdit?  It should
  1788. look wierd because you are writing binary stuff, no to mention that the
  1789. unused portions of p-strings and any fields that have not had anything
  1790. stored in them will have random values in them.  You'll want to use a hex
  1791. editor like HexEdit.
  1792.  
  1793. If you mean "wierd things when you read it back in"... of course, you
  1794. cannot expect the links ( next/previous ) to be correct.  You will want to
  1795. read in a record's worth from disk, but copy to good stuff into a brand
  1796. new record you've just created, just as you do when entering a new
  1797. record.  I figure you know this, but just in case. :)
  1798.  
  1799. Also, perhaps you should use FlushVol() as well, to ensure that all of
  1800. your file writes actually get written to disk.
  1801.  
  1802. The gist of my message here is that so often, there isn't a problem with
  1803. what we are examining, but with the methods we are using to examine
  1804. things.  That's not a new comet you've discovered, it is just a dead gnat
  1805. stuck to the lens of the telescope. :)  I've been bit by this one many
  1806. times ( but not lately :).
  1807.  
  1808. Just maybe one of the above will help to "jiggle something free" for ya.
  1809.  
  1810.  
  1811. Mark Hanrek
  1812.  
  1813. +++++++++++++++++++++++++++
  1814.  
  1815. >From howard@netcom.com (Howard Berkey)
  1816. Date: Mon, 5 Sep 1994 17:59:13 GMT
  1817. Organization: Psychonaut Foundation
  1818.  
  1819.  
  1820. Short answer:  look in a computer science textbook.
  1821.  
  1822. Non-snide answer:
  1823.  
  1824. Essentially the best way to write a data structure to a file is to first 
  1825. flatten it into an array, changing the pointers to array indices.  For 
  1826. example, to write a binary tree, make the root node element 0 of the array, 
  1827. and change its left and right node pointers to 1 and 2, respectively.  Then 
  1828. put the nodes they pointed to into those array elements.  Go to array element 
  1829. 1 and repeat.  And so on.  Reading back in is easy.  I'll append some code
  1830. at the end of the message.
  1831.  
  1832. A list is even easier.
  1833.  
  1834. Now, one thing to make sure of is that you are using the same structure
  1835. alignment between builds.  I stupidly bit myself the other day by not 
  1836. checking the project prefs in CodeWarrior the other day... the app I had
  1837. generating the file was set to 68K struct alignment, and the one reading 
  1838. it in was set to 68K 4-byte.  This caused all sorts of problems.
  1839.  
  1840. Luckily on the mac you don't need to worry about the endian-ness of the 
  1841. machine.  
  1842.  
  1843. Anyway, here's a quick example in C++.  I cut and pasted this from 
  1844. something in progress so it may contain bugs but it will get the general 
  1845. idea across (Assume that CPolygon is defined somewhere else and knows how 
  1846. to write itself):
  1847.  
  1848.  
  1849. class CBSPTree {
  1850.  
  1851. private:
  1852.       CPolygon *rootPoly;
  1853.       CBSPTree *backChild;
  1854.       CBSPTree *frontChild;
  1855.       int nodes;
  1856.       
  1857.       struct treeFileFormat 
  1858.       {
  1859.          CPolygon *thePoly;
  1860.          int       frontChild;
  1861.          int       backChild;
  1862.          int       nodes;
  1863.       };
  1864.          
  1865. public:
  1866.       
  1867.       void flattenSubtree(int current, int nextFree, struct treeFileFormat
  1868. *theArray);
  1869.  
  1870.       void writeTree(short treeFile);
  1871.       void readTree(short treeFile);
  1872.       
  1873. };
  1874.  
  1875.  
  1876.  
  1877. void CBSPTree :: writeTree(short treeFile)
  1878. {
  1879.    long inOutCount=(long) sizeof(int);
  1880.    int i;
  1881.    treeFileFormat *theArray;
  1882.    
  1883.    theArray = new treeFileFormat[this->nodes];
  1884.       
  1885.    flattenSubtree(0, 1, theArray);
  1886.             
  1887.    i=this->nodes + 1;
  1888.    FSWrite(treeFile,&inOutCount,&i);   
  1889.  
  1890.    for(i=0;i<=this->nodes;i++)
  1891.    {
  1892.       theArray[i].thePoly->writePoly(treeFile);
  1893.       FSWrite(treeFile,&inOutCount, &theArray[i].nodes);   
  1894.       FSWrite(treeFile,&inOutCount,&theArray[i].frontChild);   
  1895.       FSWrite(treeFile,&inOutCount,&theArray[i].backChild);   
  1896.    }
  1897. }
  1898.  
  1899.  
  1900.  
  1901. void CBSPTree :: flattenSubtree(int current, int nextFree, treeFileFormat
  1902. *theArray)
  1903. {      
  1904.        int myIndex;
  1905.        
  1906.        myIndex=current;
  1907.        
  1908.         if(this->rootPoly != NULL)
  1909.         {    
  1910.                 theArray[myIndex].thePoly=this->rootPoly;
  1911.                 theArray[myIndex].nodes=this->nodes;
  1912.                 if(this->frontChild != NULL)
  1913.                 {
  1914.                      theArray[myIndex].frontChild=nextFree++;
  1915.                      current=theArray[myIndex].frontChild;
  1916.                      this->frontChild->flattenSubtree(current,
  1917. nextFree,            theArray);
  1918.  
  1919.                 }
  1920.                 else
  1921.                 {
  1922.                      theArray[myIndex].frontChild=-1;
  1923.                 }
  1924.                 
  1925.                 if(this->backChild != NULL)
  1926.                 {
  1927.                      theArray[myIndex].backChild=nextFree++;
  1928.                      current=theArray[myIndex].backChild;
  1929.                      this->backChild->flattenSubtree(current, nextFree,
  1930. theArray);
  1931.  
  1932.                 }
  1933.                 else
  1934.                 {
  1935.                       theArray[myIndex].backChild=-1;
  1936.                 }
  1937.  
  1938.         }
  1939. }
  1940.  
  1941.  
  1942. void CBSPTree :: readTree(short treeFile)
  1943. {
  1944.    struct treeFileFormat *treeArray;
  1945.    CBSPTree *BSPArray, *tmpTree;
  1946.    long inOutCount=(long) sizeof(int);
  1947.    int i, count;
  1948.     
  1949.  
  1950.    SetFPos(treeFile, fsFromStart, 0);
  1951.    FSRead(treeFile, &inOutCount, &count);
  1952.    
  1953.    treeArray=new treeFileFormat[count];
  1954.    BSPArray=new CBSPTree[count];
  1955.       
  1956.    for(i=0;i<count;i++) 
  1957.    {
  1958.       treeArray[i].thePoly = new CPolygon;
  1959.       treeArray[i].thePoly->readPoly(treeFile);
  1960.       FSRead(treeFile, &inOutCount, &treeArray[i].nodes);
  1961.       FSRead(treeFile, &inOutCount, &treeArray[i].frontChild);
  1962.       FSRead(treeFile, &inOutCount, &treeArray[i].backChild);
  1963.    }
  1964.  
  1965.    for(i=0;i<count;i++)
  1966.     {
  1967.       
  1968.       BSPArray[i].rootPoly=treeArray[i].thePoly;
  1969.       BSPArray[i].nodes=treeArray[i].nodes;
  1970.       if(treeArray[i].frontChild != -1) BSPArray[i].frontChild 
  1971.                                        = &BSPArray[treeArray[i].frontChild];
  1972.       if(treeArray[i].backChild != -1) BSPArray[i].backChild 
  1973.                                        =
  1974. &BSPArray[treeArray[i].backChild];                                    
  1975.       
  1976.     }
  1977.     
  1978.    *this=BSPArray[0];   
  1979.  
  1980. }
  1981.  
  1982. -- 
  1983. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1984. Howard Berkey                                     howard@netcom.com
  1985. Segmentation Fault (core dumped)
  1986.  
  1987. ---------------------------
  1988.  
  1989. >From wdh@fresh.com (Bill Hofmann)
  1990. Subject: PBCatSearch-catChangedErr
  1991. Date: Sat, 3 Sep 1994 21:41:58 GMT
  1992. Organization: Fresh Software
  1993.  
  1994. OK, I've got PBCatSearch working, it's a little arcane, but what isn't
  1995. nowadays.    I use the results to scan certain files for certain resources
  1996. (ie, I do an FSpOpenResFile on the files returned).  But here's the
  1997. problem: AutoDoubler (and I suppose other utils of that ilk) modify the
  1998. catalog when I open the files, causing PBCatSearch to return catChangedErr
  1999. (-1304) on the next call to it.
  2000.  
  2001. So far, the only real solution seems to be a real humongous search (ie, so
  2002. that I only have to call PBCatSearch once).  Am I right?
  2003. -Bill
  2004. -- 
  2005. Bill Hofmann                                   wdh@fresh.com
  2006. Fresh Software and Instructional Design        voice: +1 510 524 0852
  2007. 1640 San Pablo Ave #C Berkeley CA 94702 USA    fax:   +1 510 524 0853
  2008.  
  2009. +++++++++++++++++++++++++++
  2010.  
  2011. >From jumplong@aol.com (Jump Long)
  2012. Date: 4 Sep 1994 12:01:05 -0400
  2013. Organization: America Online, Inc. (1-800-827-6364)
  2014.  
  2015. In article <wdh-0309941441580001@wdh.slip.netcom.com>, wdh@fresh.com (Bill
  2016. Hofmann) writes:
  2017.  
  2018. >OK, I've got PBCatSearch working, it's a little arcane, but what isn't
  2019. >nowadays.    I use the results to scan certain files for certain
  2020. resources
  2021. >(ie, I do an FSpOpenResFile on the files returned).  But here's the
  2022. >problem: AutoDoubler (and I suppose other utils of that ilk) modify the
  2023. >catalog when I open the files, causing PBCatSearch to return
  2024. catChangedErr
  2025. >(-1304) on the next call to it.
  2026. >
  2027. >So far, the only real solution seems to be a real humongous search (ie,
  2028. so
  2029. >that I only have to call PBCatSearch once).  Am I right?
  2030.  
  2031. You're right, you're best off finding all of your matches and then
  2032. processing them after the matches are found. However, this makes it
  2033. impossible to let the user cancel a long search -- you need to weigh that
  2034. against the need to get all matches.
  2035.  
  2036. BTW: Any call that writes to an HFS volume will result in a catSearchErr.
  2037. The HFS file system is a little brain dead in this respect because it
  2038. really only needs to return catSearchErr if the *catalog* changes, not
  2039. *any* write to the volume. Since the AppleShare and File Sharing file
  2040. servers use HFS's CatSearch to search on the server Macintosh, this makes
  2041. searches on AppleShare volumes fail with afpCatalogChanged even more often
  2042. (in which case, the error cannot be ignored and the search cannot be
  2043. resumed) because there will likely be multiple writers on an AppleShare
  2044. volume. I guess I should try to get HFS's CatSearch problems all fixed in
  2045. the next System Update...
  2046.  
  2047. - Jim Luther
  2048.  
  2049. ---------------------------
  2050.  
  2051. >From JFN@cmq.qc.ca (Jean-Francois Nadeau)
  2052. Subject: PixToPic
  2053. Date: 05 Sep 1994 14:48:08 GMT
  2054. Organization: Club Macintosh de Quebec
  2055.  
  2056. Hello!
  2057.  
  2058. How i can transform a PICT resource in a PixMapHandle?
  2059.  
  2060. Thanks!
  2061.  
  2062. JFN@cmq.upc.qc.ca
  2063. - -----------------------------------------------------------
  2064. Synapse -- Le serveur telematique du Club Macintosh de Quebec
  2065. vox: 418.527.0250    fax: 418.527.9304    net: info@cmq.qc.ca
  2066. - -----------------------------------------------------------
  2067.  
  2068. +++++++++++++++++++++++++++
  2069.  
  2070. >From Dmitry Boldyrev <dmitry@atlas.chem.utah.edu>
  2071. Date: 5 Sep 1994 21:49:03 GMT
  2072. Organization: University of Utah
  2073.  
  2074. In article <65502.4681425@cmq.cmq.qc.ca> Jean-Francois Nadeau, JFN@cmq.qc.ca
  2075. writes:
  2076. >Hello!
  2077. >
  2078. >How i can transform a PICT resource in a PixMapHandle?
  2079. >
  2080. >Thanks!
  2081.  
  2082. Hmm.. It shouldn't be very hard.. 
  2083. void CiconToPixmap(short res_id, PixMapPtr thebitmap)
  2084. {
  2085.     CIconHandle                theicon;
  2086.     short                    right, bottom;
  2087.     unsigned long            offRowBytes, sizeOfmap;
  2088.     sysinfo                    system;
  2089.     Ptr                        offBaseAddr = nil;
  2090.     Rect                    wbounds;
  2091.     
  2092.     GWorldPtr                 currPort;   
  2093.     GDHandle                 currDev;       
  2094.     short                     err;                 
  2095.     static Rect             dOffBounds;        // Bounds of OffScreen Graphics                                                    //
  2096. World
  2097.     static GWorldPtr         gMyOffG;        // Pointer to OffScreen Graphics World
  2098.     Boolean                    gblockAlloc;    // Variable to check the successful memoryblock
  2099. allocation
  2100.  
  2101.     
  2102.     InitSysinfo( &system );    
  2103.     theicon = GetCIcon( res_id );    
  2104.     right = ( (**theicon).iconBMap ).bounds.right;
  2105.     bottom =  ( (**theicon).iconBMap ).bounds.bottom;
  2106.     SetRect( &wbounds, 0, 0, GameResHr, GameResVr );
  2107.     SetRect( &dOffBounds, 0, 0, right, bottom );
  2108.  
  2109.     GetGWorld( &currPort, &currDev );        // Build Offscreen Graphics world
  2110.     err = NewGWorld( &gMyOffG, 0, &dOffBounds, nil, nil, 0 ); // Create Offscreen
  2111. Graphics worl
  2112.     if ( err != noErr )
  2113.     {
  2114.         /* ... */
  2115.     }
  2116.  
  2117.     // Lock down Pixels that we are drawing to so that memory will not
  2118.     // move
  2119.     gblockAlloc = LockPixels (gMyOffG->portPixMap);
  2120.     
  2121.     if ( !gblockAlloc )
  2122.     {
  2123.         /* ... */
  2124.     }
  2125.     
  2126.     // Setup drawing area to be our offscreen graphics world
  2127.     
  2128.     SetGWorld (gMyOffG, nil);
  2129.     
  2130.     //The drawing area
  2131.     
  2132.     PlotCIcon( &dOffBounds, theicon );
  2133.     
  2134.     // Done drawing, now reset Port etc.
  2135.  
  2136.     SetGWorld (currPort, currDev);
  2137.  
  2138.     // Initialize the PixMap for copying
  2139.     
  2140.     offRowBytes = ( ( ( system.PixelDepth * right ) + 31 ) / 32 ) * 4;
  2141.     sizeOfmap = bottom * offRowBytes;                                    
  2142.     offBaseAddr = NewPtr( sizeOfmap );
  2143.     if ( offBaseAddr = nil )
  2144.     {
  2145.         /* ... */
  2146.     }
  2147.  
  2148.  
  2149.     printf( "%d\n", offRowBytes );
  2150.     while( !Button() ){}
  2151.     thebitmap->baseAddr = offBaseAddr;
  2152.     thebitmap->rowBytes = offRowBytes;
  2153.     thebitmap->bounds = (**theicon).iconPMap.bounds;
  2154.     BlitPixie( *gMyOffG->portPixMap, thebitmap, &(**theicon).iconPMap.bounds,
  2155. &thebitmap->bounds, &wbounds ); 
  2156.     UnlockPixels( gMyOffG->portPixMap );
  2157. }
  2158.  
  2159.  
  2160. Oh, btw, use CopyBits instead of BlitPixie.. easy to modify..
  2161.  
  2162. Dmitry
  2163. (A friend of mine wrote it.. His name is John Whited)
  2164.  
  2165. +++++++++++++++++++++++++++
  2166.  
  2167. >From gurgle@dnai.com (Pete Gontier)
  2168. Date: Mon, 05 Sep 1994 16:27:52 -0800
  2169. Organization: Integer Poet Software
  2170.  
  2171. In article <65502.4681425@cmq.cmq.qc.ca>, JFN@cmq.qc.ca wrote:
  2172.  
  2173. > How i can transform a PICT resource in a PixMapHandle?
  2174.  
  2175. This question, puzzlingly, comes up pretty often, even though it has a
  2176. fairly obvious one-word answer:
  2177.  
  2178.     DrawPicture
  2179.  
  2180. There must be something about the topic that's inherently confusing, or it
  2181. wouldn't come up so often. Of course, you have to have a pixel map lying
  2182. around, but sample code for that is easy enough to find; here is the
  2183. canonical reference:
  2184.  
  2185.     ftp://ftp.apple.com/dts/mac/tn/quickdraw.qd/qd-13-principia-off-screen.hqx
  2186.  
  2187. I have also posted some sample code for TCL 1.1.3, called 'CPixMap'.
  2188.  
  2189.     ftp://ftp.dnai.com/users/gurgle/CPixMap.sit.bin
  2190.  
  2191. Now, you could be talking about grabbing a pixel map and putting it into a
  2192. picture. That has a three-word answer:
  2193.  
  2194.     OpenPicture
  2195.     CopyBits
  2196.     ClosePicture
  2197.  
  2198. In either case, you'll be needing a pixel map. :-)
  2199.  
  2200. -- 
  2201.  
  2202.  Pete Gontier // Integer Poet Software // gurgle@dnai.com
  2203.  
  2204.  "The need to be (or appear to be) sophisticated pervades the very
  2205.  atmosphere in which we, the Magazine Reading Class, move."
  2206.                   -- Eliis Weiner, Spy Magazine, 9/94
  2207.  
  2208. ---------------------------
  2209.  
  2210. >From bb@lightside.com (Bob Bradley)
  2211. Subject: Slashed Progress Bar
  2212. Date: Sat, 27 Aug 1994 02:25:15 -0800
  2213. Organization: SS Software Inc.
  2214.  
  2215. I'm trying to implement the Slashed Progress Bar just like Anarchie's when
  2216. it's trying to connect and similar to the Finder's when it's doing
  2217. something that it doesn't know how long it will take.
  2218.  
  2219. I've looked at Anarchie and it doesn't seem to use a PICT resource like
  2220. the Finder does. I'd like to do something similar to Anarchie but, am not
  2221. sure how. Anyone have any sample source or suggestions?
  2222.  
  2223. I'm writing a simple progress bar CDEF that will do progress bars ike
  2224. normal and support that moving slashed "Not sure how long it will take
  2225. but, I'm trying" look which I why I want to stay away from PICT's.
  2226.  
  2227. +++++++++++++++++++++++++++
  2228.  
  2229. >From trygve@netcom.com (Trygve Isaacson)
  2230. Date: Mon, 29 Aug 1994 00:51:29 GMT
  2231. Organization: Wall Data Incorporated
  2232.  
  2233. In article <bb-2708940225150001@user57.lightside.com>, bb@lightside.com
  2234. (Bob Bradley) wrote:
  2235.  
  2236. [ deletia ]
  2237. > I've looked at Anarchie and it doesn't seem to use a PICT resource like
  2238. > the Finder does. I'd like to do something similar to Anarchie but, am not
  2239. > sure how. Anyone have any sample source or suggestions?
  2240. > I'm writing a simple progress bar CDEF that will do progress bars ike
  2241. > normal and support that moving slashed "Not sure how long it will take
  2242. > but, I'm trying" look which I why I want to stay away from PICT's.
  2243.  
  2244. I prefer the term "meat grinder" for the unknown-duration effect :)
  2245.  
  2246. First, I'd suggest looking in the various source code archives on the net.
  2247. There's got to be a CDEF out there that already does this. If not...
  2248.  
  2249. You say you want to stay away from PICTs, but I don't see why. When you
  2250. know how long it's going to take, draw the two gauge parts yourself
  2251. (FillRect or PaintRect each rectangle). When you don't know how long it's
  2252. going to take, just cycle through the four meat grinder PICTs (roll your
  2253. own or just use the Finder's).
  2254.  
  2255. As for the gauge bar color values, here's what I'm using (I think I got
  2256. these by taking screen shots of the Finder's progress dialog and testing
  2257. the color values in Photoshop or something). I imagine there's some RGB
  2258. value that would work in all depths without require a depth test, but
  2259. these look right.
  2260.  
  2261. "Completed" gauge colors:
  2262. 8-bit, dark gray: r=g=b=17476
  2263. 2-bit, dark gray: r=g=b=21845
  2264. 1-bit, black    : r=g=b=0
  2265.  
  2266. "Uncompleted" gauge colors:
  2267. 8-bit, light purple: r=g=54248, b=65535
  2268. 2-bit, light gray  : r=g=b=43690
  2269. 1-bit, white       : r=g=b=65535
  2270.  
  2271. I rolled everything into a TGauge MacApp control class, but since you're
  2272. doing a CDEF, you might want to define special meaning to the control's
  2273. min/max/value to achieve the meat grinder effect. E.g.: if max<min, then
  2274. SetCtlValue cranks the meat grinder. Something like that.
  2275.  
  2276. ..........................................................................
  2277. Trygve Isaacson           trygve@netcom.com         Wall Data Incorporated
  2278. ..........................................................................
  2279.   "Books are burning in the main square
  2280.                         And I saw there the fire eating the text
  2281.      Books are burning in the still air
  2282.                      And you know where they burn books people are next"
  2283.                                                   -- Andy Partridge, XTC
  2284.  
  2285. +++++++++++++++++++++++++++
  2286.  
  2287. >From heathcot@bnr.ca (Graham Heathcote)
  2288. Date: Mon, 29 Aug 1994 00:29:35 GMT
  2289. Organization: BNR Australia
  2290.  
  2291. In article <bb-2708940225150001@user57.lightside.com>, bb@lightside.com
  2292. (Bob Bradley) wrote:
  2293.  
  2294. > I'm trying to implement the Slashed Progress Bar just like Anarchie's when
  2295. > it's trying to connect and similar to the Finder's when it's doing
  2296. > something that it doesn't know how long it will take.
  2297. > I've looked at Anarchie and it doesn't seem to use a PICT resource like
  2298. > the Finder does. I'd like to do something similar to Anarchie but, am not
  2299. > sure how. Anyone have any sample source or suggestions?
  2300. > I'm writing a simple progress bar CDEF that will do progress bars ike
  2301. > normal and support that moving slashed "Not sure how long it will take
  2302. > but, I'm trying" look which I why I want to stay away from PICT's.
  2303.  
  2304. I have just implemented a C++ class to perform the standard progress bar
  2305. and the slashed bar as you call it. I have a few things to finish off and
  2306. then will be placing the sources into c.s.m.
  2307.  
  2308. I thought about implementing the picture method of Finder, but this didn't
  2309. work for my implementation as I wanted the progress bar to be any size as
  2310. defined in the DITL, and the picture needs to be the same size as the user
  2311. item or it will be scalled, YUK. So I went with a pixel pattern (or infact
  2312. 16) and just filled the user item with each successive pattern. This gives
  2313. exactly the same effect as the finder, except since I am using 16 images
  2314. it is much smother than Finder.
  2315.  
  2316. e-mail me if you need any more details, or a preliminary copy of the
  2317. source and example app I have put together.
  2318.  
  2319. Regards,
  2320. Graham Heathcote.
  2321.  
  2322. -- 
  2323. Graham Heathcote
  2324. BNR Australia
  2325. email:   heathcot@bnr.ca
  2326.  
  2327. +++++++++++++++++++++++++++
  2328.  
  2329. >From Matt Slot <fprefect@engin.umich.edu>
  2330. Date: 29 Aug 1994 01:50:48 GMT
  2331. Organization: University of Michigan
  2332.  
  2333. Bob Bradley, bb@lightside.com writes:
  2334.  
  2335. >I'm trying to implement the Slashed Progress Bar just like Anarchie's when
  2336. >it's trying to connect and similar to the Finder's when it's doing
  2337. >something that it doesn't know how long it will take.
  2338. ...
  2339. >I'm writing a simple progress bar CDEF that will do progress bars ike
  2340. >normal and support that moving slashed "Not sure how long it will take
  2341. >but, I'm trying" look which I why I want to stay away from PICT's.
  2342.  
  2343. I downloaded a progress bar CDEF from the archives, one done by
  2344. Eddy J. Gurney from HP, and added the "barber-shop pole" idling effect.
  2345. I sent him a copy and his response was favorable. I will post this to
  2346. alt.sources.mac, with a tester for you to try out.
  2347.  
  2348. The basic idea is that the progress goes from 0 to n (begin -> end), and
  2349. to make it idle you cycle from -4 to -1 (well anything negative MOD 4).
  2350.  
  2351. I can't say its the fastest or best implementation, but it is satisfactory
  2352. for what I have used it in so far.
  2353.  
  2354. Matt
  2355.  
  2356. +++++++++++++++++++++++++++
  2357.  
  2358. >From giles@med.cornell.edu (Aaron Giles)
  2359. Date: 29 Aug 1994 02:14:59 GMT
  2360. Organization: Cornell University Medical College
  2361.  
  2362. In article <bb-2708940225150001@user57.lightside.com>, bb@lightside.com
  2363. (Bob Bradley) wrote:
  2364.  
  2365. > I've looked at Anarchie and it doesn't seem to use a PICT resource like
  2366. > the Finder does. I'd like to do something similar to Anarchie but, am not
  2367. > sure how. Anyone have any sample source or suggestions?
  2368.  
  2369. Well, here is some example code which I used in JPEGView.  Basically, it
  2370. involves setting the PenWidth to a wide pen and drawing some diagonal
  2371. lines.  It is implemented as a dialog user item; each time this user item
  2372. gets called, it increments the position of the bar.  I just do an
  2373. InvalRect() on the user item to get it move one notch.
  2374.  
  2375. // defined elsewhere in the application
  2376. static const RGBColor kBlack = { 0x0000, 0x0000, 0x0000 };
  2377.  
  2378. // draw an indefinite progress bar using the standard Finder colors
  2379. static pascal void UpdateBarIndef(DialogPtr theDialog, short theItem) 
  2380. {
  2381.    static RGBColor gBarBackground = { 0xcccc, 0xcccc, 0xffff };
  2382.    static RGBColor gBarForeground = { 0x4000, 0x4000, 0x4000 };
  2383.    static short gBarOffset = 0;
  2384.    Boolean useBW = !(((CGrafPtr)theDialog)->portVersion & 0xc000) || 
  2385.       (*((CGrafPtr)theDialog)->portPixMap)->pixelSize == 1;
  2386.    short itemType, left;
  2387.    Handle itemHandle;
  2388.    RgnHandle oldClip;
  2389.    GrafPtr oldPort;
  2390.    Rect itemRect;
  2391.    
  2392.    GetPort(oldPort);
  2393.    SetPort(theDialog);
  2394.    GetDItem(theDialog, theItem, &itemType, &itemHandle, &itemRect);
  2395.    if (oldClip = NewRgn()) {
  2396.       GetClip(oldClip);
  2397.       PenSize(1, 1);
  2398.       RGBForeColor(&kBlack);
  2399.       FrameRect(&itemRect);
  2400.       InsetRect(&itemRect, 1, 1);
  2401.       ClipRect(&itemRect);
  2402.       left = itemRect.left - (3 * Height(&itemRect)) + 
  2403.              (gBarOffset * Height(&itemRect) / 2);
  2404.       PenSize(Height(&itemRect), 1);
  2405.       while (left < itemRect.right) {
  2406.          RGBForeColor(&gBarForeground);
  2407.          MoveTo(left, itemRect.top);
  2408.          LineTo(left += Height(&itemRect), itemRect.bottom);
  2409.          if (useBW) RGBForeColor(&kWhite);
  2410.          else RGBForeColor(&gBarBackground);
  2411.          MoveTo(left, itemRect.top);
  2412.          LineTo(left += Height(&itemRect), itemRect.bottom);
  2413.       }
  2414.       PenSize(1, 1);
  2415.       SetClip(oldClip);
  2416.       DisposeRgn(oldClip);
  2417.       gBarOffset = (gBarOffset + 1) & 3;
  2418.    }
  2419.    RGBForeColor(&kBlack);
  2420.    SetPort(oldPort);
  2421. }
  2422. -- 
  2423. Aaron Giles (giles@med.cornell.edu)
  2424. Power Macintosh Developer, Cornell University Medical College
  2425. JPEGView home page: http://www.med.cornell.edu/jpegview.html
  2426. JPEGView FTP site:   ftp://ftp.med.cornell.edu/pub/aarong/jpegview/
  2427.  
  2428. +++++++++++++++++++++++++++
  2429.  
  2430. >From alexr@apple.com (Alex Rosenberg)
  2431. Date: Mon, 29 Aug 1994 07:59:37 GMT
  2432. Organization: Hackers Anonymous
  2433.  
  2434. In article <heathcot-2908941028320001@47.181.192.70>, heathcot@bnr.ca
  2435. (Graham Heathcote) wrote:
  2436.  
  2437. > In article <bb-2708940225150001@user57.lightside.com>, bb@lightside.com
  2438. > (Bob Bradley) wrote:
  2439. > > I'm trying to implement the Slashed Progress Bar just like Anarchie's when
  2440. > > it's trying to connect and similar to the Finder's when it's doing
  2441. > > something that it doesn't know how long it will take.
  2442. > > 
  2443. > > I've looked at Anarchie and it doesn't seem to use a PICT resource like
  2444. > > the Finder does. I'd like to do something similar to Anarchie but, am not
  2445. > > sure how. Anyone have any sample source or suggestions?
  2446. > > 
  2447. > > I'm writing a simple progress bar CDEF that will do progress bars ike
  2448. > > normal and support that moving slashed "Not sure how long it will take
  2449. > > but, I'm trying" look which I why I want to stay away from PICT's.
  2450. > I have just implemented a C++ class to perform the standard progress bar
  2451. > and the slashed bar as you call it. I have a few things to finish off and
  2452. > then will be placing the sources into c.s.m.
  2453. > I thought about implementing the picture method of Finder, but this didn't
  2454. > work for my implementation as I wanted the progress bar to be any size as
  2455. > defined in the DITL, and the picture needs to be the same size as the user
  2456. > item or it will be scalled, YUK. So I went with a pixel pattern (or infact
  2457. > 16) and just filled the user item with each successive pattern. This gives
  2458. > exactly the same effect as the finder, except since I am using 16 images
  2459. > it is much smother than Finder.
  2460.  
  2461. Instead of using multiple patterns, you can get the same effect by moving
  2462. the origin with a SetOrigin call. (As I do in XMODEM Tool 1.1.)
  2463.  
  2464. - -------------------------------------------------------------------------
  2465. -  Alexander M. Rosenberg  - INTERNET: alexr@apple.com      - Yoyodyne    -
  2466. -  330 Waverley St., Apt B - UUCP:ucbvax!apple!alexr        - Propulsion  -
  2467. -  Palo Alto, CA 94301     -                                - Systems     -
  2468. -  (415) 329-8463          - Nobody is my employer so       - :-)         -
  2469. -  (408) 974-3110          - nobody cares what I say.       -             -
  2470.  
  2471. +++++++++++++++++++++++++++
  2472.  
  2473. >From msguzzo@srqa01.jsc.nasa.gov (Michael Guzzo)
  2474. Date: Mon, 29 Aug 1994 15:20:45
  2475. Organization: Calspan/Space Shuttle Safety & Mission Assurance
  2476.  
  2477. In article <bb-2708940225150001@user57.lightside.com> bb@lightside.com (Bob Bradley) writes:
  2478. >From: bb@lightside.com (Bob Bradley)
  2479. >Subject: Slashed Progress Bar
  2480. >Date: Sat, 27 Aug 1994 02:25:15 -0800
  2481.  
  2482. >I'm trying to implement the Slashed Progress Bar just like Anarchie's when
  2483. >it's trying to connect and similar to the Finder's when it's doing
  2484. >something that it doesn't know how long it will take.
  2485.  
  2486. >I've looked at Anarchie and it doesn't seem to use a PICT resource like
  2487. >the Finder does. I'd like to do something similar to Anarchie but, am not
  2488. >sure how. Anyone have any sample source or suggestions?
  2489.  
  2490. >I'm writing a simple progress bar CDEF that will do progress bars ike
  2491. >normal and support that moving slashed "Not sure how long it will take
  2492. >but, I'm trying" look which I why I want to stay away from PICT's.
  2493.  
  2494. How about using two ppats? Set the pen height and width to the height of 
  2495. your progress bar using the ppat, draw a filled rect, and then switch to the 
  2496. other ppat.. continue until you're done. Draw the ppat to look like the 
  2497. barberpole is moving.
  2498.  
  2499. Just off the top of my head, I don't have any sample code...
  2500.  
  2501. ________________________________________________________________________
  2502. Michael S. Guzzo
  2503. msguzzo@srqa01.jsc.nasa.gov
  2504. You're gonna have to face it, you're addicted to Doom!
  2505.  
  2506. +++++++++++++++++++++++++++
  2507.  
  2508. >From Chris Ferris <chris@tycho.demon.co.uk>
  2509. Date: Sun, 4 Sep 1994 15:16:44 GMT
  2510. Organization: Tycho Consultants
  2511.  
  2512.  
  2513. In article <msguzzo.72.000F590A@srqa01.jsc.nasa.gov>, Michael Guzzo 
  2514. writes:
  2515.  
  2516. >
  2517. > In article <bb-2708940225150001@user57.lightside.com> 
  2518. bb@lightside.com (Bob Bradley) writes:
  2519. > >From: bb@lightside.com (Bob Bradley)
  2520. > >Subject: Slashed Progress Bar
  2521. > >Date: Sat, 27 Aug 1994 02:25:15 -0800
  2522. > >I'm trying to implement the Slashed Progress Bar...
  2523.  
  2524. [ Stuff cut ]
  2525.  
  2526. > How about using two ppats? Set the pen height and width to the 
  2527. height of 
  2528. > your progress bar using the ppat, draw a filled rect, and then 
  2529. switch to the 
  2530. > other ppat.. continue until you're done. Draw the ppat to look like 
  2531. the 
  2532. > barberpole is moving.
  2533.  
  2534.  
  2535. There is a simpler solution using only one ppat. Define a single ppat 
  2536. for the 'barbers pole' which is black and white separated diagonaly 
  2537.  
  2538. 11111111 = 0xFF
  2539. 01111111 = 0x7F
  2540. 00111111 = 0x3F
  2541. 00011111 = 0x1F
  2542. 00001111 = 0x0F
  2543. 00000111 = 0x07
  2544. 00000011 = 0x03
  2545. 00000001 = 0x01
  2546.  
  2547. Inside your progress bar function use SetOrigin to move the 
  2548. co-ordinate system used by QD patterns by one pixel horizontally for 
  2549. each update to the bar, resetting to 0 when you reach 8.
  2550.  
  2551. The pattern will appear to move along the progress bar, just remember 
  2552. to compensate for the change in co-ordinates before calling FillRect.
  2553.  
  2554.  
  2555.    ___       |                 chris@tycho.demon.co.uk
  2556.   /  ___     |             Chris Ferris, Tycho Consultants
  2557.  /__/_       |
  2558.    /         |  'The best way to predict the future is to invent it!'
  2559.   /          |                          Apple Computer Inc
  2560.  
  2561.  
  2562. ---------------------------
  2563.  
  2564. End of C.S.M.P. Digest
  2565. **********************
  2566.  
  2567.  
  2568.  
  2569.